1主从同步
1.1Master
1.1.1配置--编辑 my.cnf
#编辑 mysql 的 /etc/my.cnf 配置文件
vi /etc/my.cnf
#添加如下配置
server-id=1 #设置服务 ID
log_bin=mysql-bin #启动 binlog日志
sync-binlog=1 #控制数据库的binlog刷到磁盘上去 , 0 不控制,性能最好,1每次事物提交都会刷到日志文件中,性能最差,最安全
binlog_format = mixed #binlog日志格式,mysql默认采用statement,建议使用mixed
expire_logs_days = 7 #binlog过期清理时间
max_binlog_size = 100m #binlog每个日志文件大小
binlog_cache_size = 4m #binlog缓存大小
max_binlog_cache_size= 512m #最大binlog缓存大
binlog-ignore-db=mysql,performance_schema,information_schema,sys #不生成日志文件的数据库,多个忽略数据库可以用逗号拼接,或者 复制这句话,写多行
#binlong-do-db=lagou #生成日志文件的数据库
slave-skip-errors = all #跳过从库错误
1.1.2重启 mysql 服务
systemctl restart mysqld
1.1.3 mysql 开放权限
#用户授权
mysql> grant replication slave on *.* to 'root'@'%' identified by 'root';
Query OK, 0 rows affected, 1 warning (0.18 sec)
#从节点授权
mysql> grant all privileges on *.* to 'root'@'%' identified by 'root';
Query OK, 0 rows affected, 1 warning (0.09 sec)
#刷新缓存
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
1.1.4.查看mysql master 状态
1.2 SLAVE
1.2.1 配置 /ect/my.cnf
#添加配置
server-id = 2 #编号
log-bin=mysql-bin #开启 binlog 可选择
relay-log = mysql-relay-bin #relay 同步日志
replicate-wild-ignore-table=mysql.% #忽略哪些表和库
slave-skip-errors=all #跳过错误,同步 慎用
#跳过所有的错误,继续执行复制操作
1.2.2 重启服务
systemctl restart mysqld
1.2.3 配置master地址,同步
mysql> change master to master_host="10.3.1.210", #masterIP
master_port=3306, #master 端口
master_user='root', #master 用户
master_password='root', #master 密码
master_log_file='mysql-bin.000002', #master主库 bin日志名称
master_log_pos=2009; #master主库 同步位置
mysql> start slave; #启动 slave 状态;
mysql> show slave status \G; #显示 slave状态 停止slave 为 stop slave 清除 slave 为 reset slave
重点关注标红字段都为yes可同步。
同步错误处理,查看相关日志
解决 Slave_SQL_Running: No
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;
Query OK, 0 rows affected (0.00 sec)
mysql> start slave;
2.半同步复制
2.1 Master
#查看是否可以 同步加载
mysql> select @@have_dynamic_loading;
+------------------------+
| @@have_dynamic_loading |
+------------------------+
| YES |
+------------------------+
1 row in set (0.02 sec)
#安装插件 rpl_semi_sync_master
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.46 sec)
#查询相关 参数
mysql> show variables like '%semi%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | OFF |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.31 sec)
# 开启 半同步复制
mysql> set global rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.09 sec)
#设置延时 1秒
mysql> set global rpl_semi_sync_master_timeout=1000;
Query OK, 0 rows affected (0.00 sec)
为了让mysql在重启时自动加载该功能,在/etc/my.cnf中加入:
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 #1000为1000ms的超时时间。
2.2 slave
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (1.00 sec)
mysql> show variables like '%semi%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | OFF |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
2 rows in set (0.80 sec)
mysql> set global rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.00 sec)
为了让mysql在重启时自动加载该功能,在/etc/my.cnf中加入:
rpl_semi_sync_slave_enabled=1
2.3 日志查看
master 中 /var/log/mysqld.log
查看同步状态和节点
show global status like 'rpl%';