主读之间是读写分离的系统。
主备数据之间通过binlog同步数据库数据。
主读字节,通过binlog同步数据。
读备数据库, 通过binlog同步数据。
keepalived用来保证主备数据库之间实现高可用 。
我们通过这种方法实现,读写分离和高可用方案。
数据库之间binlog的同步配置,mysql配置文件
[client]
port=3306
default-character-set=utf8mb4
#MySQLscokt文件配置
socket=/mysqldata/mysql3306/mysql.sock
[mysql]
port=3306
default-character-set=utf8mb4
[mysqld]
user=mysql
prot=3306
basedir=/mysqldata
lc_message_dir=/usr/shara/mysql
datadir=/mysqldata/mysql3306/data
tmpdir=/mysqldata/msyql3306/tmp
socket=/mysqldata/mysql3306/mysql.sock
pid_file=/msyqldata/mysql3306/mysql.pid
symbolic_links=0
explicit_default_for_timestamp=0
skip_external_locking=1
skip_ssl=1
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_AUTO_VALUE_ON_ZERO
#字符集
character_set_server=uft8mb4
collation_server=utf8mb4_bin
init_connect='SET NAMES utf8mb4'
#表名字段忽略大小写
lower_case_table_names=1
#开启event 功能,备库建议关闭
event_scheduler=1
##连接相关参数###
#默认最大连接16384
max_connections=2000
#阻止过多尝试失败的客户端连接
max_connections_errors=50
#服务器等待连接的时间 mysql-error 中经常出现 "Lost connection to mysql server at 'XXX', system error:errno"可以适当增加该值
connect_timeout=10
#等待客户端响应超时 默认28800
wait_timeout=1800
#打开文件数
open_files_limit=65535
##内存缓存相关参数##
#限制server接受的数据包大小
max_allowed_packet=64M
#msyql读入缓存大小
read_buffer_size=1M
#开启随机读缓冲区#
read_rnd_buffer_size=5M
##线程缓冲池##
thread_cache_size=64
###每个线程分配的内存大小#
thread_stack=262144
#指定分配缓冲区空间的最小单位
query_cache_min_res_unit=1K
##开启查询缓存 0(OFF),1(ON)和2(DEMAND) ##
query_cache_type=1;
#查询缓存大小##
query_cache_size=64M
##指定单个查询能够使用的缓冲区大小##
query_cache_limit=1M
##限制缓存表的最大数目##
table_open_cache=512
##需要排序的缓存大小#
sort_buffer_size=256K
##内存临时表大小##
tmp_table_size=64M
##可以创建的内存表大小 不小于tmp_table_size#
max_heap_table_size=64M
###日志相关参数####
###错误日志##
log_error=/mysqllog/mysql3306/log/mysqld.log
###二进制日志###
log_bin=/mysqllog/mysql3306/binlog/mysql-bin
server-id=1
###二进制日志自动删除/过期天数##
expire_logs_days=7
sync_binlog=1
###单个二进制日志自动删除/过期天数###
max_binlog_size=100M
##binlog能够使用的最大cache大小##
max_binlog_cache_size=200M
##慢日志###
log_queries_not_using_indexes=0
slow_query_log=1
slow_query_log_file=/msyqllog/mysql3306/log/mysql-show.log
##记录超过多少秒的SQL语句#
long_query_time=1
###日志时间跟随系统时间##
log_timestamps=SYSTEM
##binlog_format##
binlog_format=row
##遭遇故障,暂停日志写入,并关闭数据库
binlog_error_action=ABORT_SERER
######INNODB 相关参数#########
default_storage_engine=InnoDB
disabled_storage_engines=ARCHIVE,BLACKHOLE,EXAMPLE,FEDERATED,MEMORY,MERGE,NDB
##开启innodb为独立空间模式
innodb_file_per_table=1
##redo log 数量#
innodb_log_files_in_group=2
##innodb 中读写操作的IO线程数,默认为4
innodb_write_io_threads=8
innodb_read_io_threads=8
##打开死锁监控
innodb_print_all_deadlocks=1
#严格模式
innodb_strict_mode=1
innodb_sort_buffer_size=8M
innodb_stats_persistent_sample_pages=64
innodb_autoinc_lock_mode=2
innodb_online_alter_log_max_size=1G
innodb_open_file=4096
innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:20G
##Undo log config
innodb_rollback_segments=128
innodb_undo_log_truncate=1
innodb_max_undo_log_size=4G
#指定INNODB 一次可以保持打开的.idb文件最大数量
innodb_open_files=60000
##设置提交事务时日志缓冲写入日志文件,对日志入磁盘
innodb_flush_log_at_trx_commit=1
#存储数据库结构和其他内部数据结构的内存池
innodb_additional_mem_pool_size=16M
#锁超时时间设置秒
innodb_lock_wait_timeout=50
#日志缓存 默认1MB 通常设置8~16
innodb_log_buffer_size=16M
#每个日志文件大小
innodb_log_file_size=128M
innodb_log_group_home_dir=/mysqldata/mysql3306/data
inodb_data_file_path=ibdata1:128M:autoextend
innodb_autoextend_increment=16
##从库记录binlog ,主从设置
log_slave_updates=1
relay_log_recovery=1
relay_log=/mysqllog/mysql3306/relaylog/mysql-relay
##replicate-wild-ignore-table=performance_schema.%
master-info-repository=TABLE
relay-log-info-repository=TABLE
##并行复制
slave-parallel-type=LOGICAL_CLOCK
##复制工作线程数量,如果主库业务并发大 可以调整
slave_parallel_workers=16
##从库并行回放时,保证提交顺序与relay log中事务顺序相同
slave_preserve_commit_order=ON
slave_rows_search_algorithms='INDEX_SCAN,HASH_SCAN'
gtid_mode =ON
enforece_gtid_consistency=1
binlog_gtid_simple_recovery=1
主要关注
关键性配置:
server-id = 1 #MySQL服务器标志,必须唯一
log-bin=mysql-bin #二进制日志文件的位置和命名
log-slave-updates=1 #事件自动更新到日志中
sync_binlog=1 #日志文件同步到磁盘上
replicate_do_db=test #要同步的数据库名称
重启服务:
systemctl restart mysqld
查找密码
grep password /mysqldata/mysql3306/log/mysqld.log
mysql -uroot -p
set password for root@localhost=password('password');
flush privileges;
#创建同步用户
GRANT replication slave on *.* to 'sql_back' ;
设置权限
GRANT replication slave on *.* to 'sql_backup'@'%' identified by 'passwd' ;
配置同步
主
change master to
master_port=3306,
master_host='IP',
master_user='sql_backup',
master_password='passwd',
master_log_file='mysql-bin.000002',
master_log_pos='2301';
start slave;
备
change master to
master_port=3306,
master_host='IP',
master_user='sql_backup',
master_password='passwd',
master_log_file='mysql-bin.000002',
master_log_pos='3106',
start slave;
从
change master to
master_port=3306,
master_host='IP',
master_user='sql_backup',
master_password='passwd',
master_log_file='mysql-bin.000002',
master_log_pos='3106',
change master to
master_port=3306,
master_host='IP',
master_user='sql_backup',
master_password='passwd',
master_log_file='mysql-bin.000002',
master_log_pos='2301',
start slave;
查看同步是否正确执行
show slave status \G;
keepaliev
keepalived是一个类似于layer3, 4 &7交换机制的软件,也就是我们平时说的第3层、第4层和第7层交换。Keepalived是自动完成,不需人工干涉。
Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router
RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。
Keepalived使用虚拟IP实现双机热备解决方案。
建议使用yum安装 源码安装有太多依赖包的问题
!Configuration File for keepalied
global_defs {
router_id promaster01 #唯一ID
}
vrrp_script check_mysql {
script"执行的脚本 如 /bin/stat.sh "
interval 5 #脚本执行间隔
weight -20 #检测后优先级增量
}
vrrp_instance V1_HA {
state MASTER
interface eth0 #网卡
virtual_router_id 70 #组ID 同组相同
priority 100 #优先级 主大于备
adver_int 2 #vrrp通告间隔时间
nopreempt #不抢占模式
authentication {
auth_type PASS #通讯协议
auth_pass 1111
}
unicat_src_ip #ip 为本节点
unicat_peer{
ip#通知的节点IP
}
#检测脚本
track_script {
check_msyql
}
virtual_ipaddress{
虚IP
}
}
其他配置可以模仿它写