# 集群
# 可选主从架构方案
主要使用一主一从和一主多从方案
# 部署方案
# 架构方案
# 8.0
# 搭建主库
创建文件 E:\www\sql\rw\master1\conf\my.cnf
/www/sql/rw/master1/conf/my.cnf
[mysqld]
log-bin=mysql-bin #开启二进制日志
server-id=1 #服务id,不可重复
#二进制日志方式
binlog_format=MIXED
binlog-do-db=fms
# 不同步的二进制数据库名,如果不设置可将其注释掉;
binlog-ignore-db=test
binlog-ignore-db=mysql
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
E:\www\sql\rw\master1
# /www/sql/rw/master1
chmod 777 * -R
chmod 644 /www/sql/rw/master1/conf/my.cnf
1
2
3
4
5
2
3
4
5
$ docker run --name master1 -v E:\www\sql\rw\master1\data:/var/lib/mysql -v E:\www\sql\rw\master1\conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 3307:3306 -d mysql:8
# Linux
$ docker run --name master1 -v /www/sql/rw/master1/data:/var/lib/mysql -v /www/sql/rw/master1/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:8
docker run -it --rm mysql:8 --verbose --help
1
2
3
4
5
2
3
4
5
创建同步账户以及授权
create user 'repuser'@'%' identified by 'repuser';
grant replication slave on *.* to 'repuser'@'%';
flush privileges;
#=====================
create user 'repl'@'%' IDENTIFIED WITH mysql_native_password by 'repl';
grant replication slave on *.* to 'repuser'@'%';
grant replication slave on *.* to 'repl'@'%'; ### identified by 'repl';
flush privileges;
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
#查看master状态
show master status;
#查看二进制日志相关的配置项
show global variables like 'binlog%';
#查看server相关的配置项
show global variables like 'server%';
1
2
3
4
5
6
2
3
4
5
6
# 搭建从库
#创建配置文件 E:\www\sql\rw\slave1\conf\my.cnf
# /www/sql/rw/slave1/conf/my.cnf
[mysqld]
server-id=2 #服务id,不可重复
# 级联同步时需要开启bin-log
# log-bin=mysql-bin
1
2
3
4
5
6
7
2
3
4
5
6
7
E:\www\sql\rw\slave1
/www/sql/rw/slave1
chmod 777 * -R
chmod 644 /www/sql/rw/slave1/conf/my.cnf
1
2
3
4
5
6
2
3
4
5
6
docker run --name slave1 -v E:\www\sql\rw\slave1\data:/var/lib/mysql -v E:\www\sql\rw\slave1\conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 3308:3306 -d mysql:8
# Linux
docker run --name slave1 -v /www/sql/rw/slave1/data:/var/lib/mysql -v /www/sql/rw/slave1/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 3308:3306 -d mysql:8
1
2
3
2
3
# 设置master相关信息
CHANGE MASTER TO
master_host='192.168.211.135',
master_user='repl',
master_password='repl',
master_port=3306,
master_log_file='mysql-bin.000003',
master_log_pos=1519;
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
启动同步
start slave;
# stop slave;
# reset slave;
查看master状态
show slave status;
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# “Public Key Retrieval is not allowed”的错误 时使用
mysql -urepuser -prepuser -h 192.168.211.135 -P3306 --get-server-public-key
如果报错
[ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master 'masttos@10.10.10.1:3306' - retry-time: 60 retries: 10 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061
一般是因为主从同步用户的密码插件导致的。解决办法两种:
1、到主库去修改主从同步的用户的密码插件:
ALTER USER 'masttos'@'%' IDENTIFIED WITH mysql_native_password BY '1qaz@WSX';
2、在配置主从同步的时候增加 GET_MASTER_PUBLIC_KEY = {0|1} 的选项。
此选项适用于使用GET_MASTER_PUBLIC_KEY身份验证插件进行身份验证的副本。对于使用此插件进行身份验证的帐户连接,除非请求,否则源不会发送公钥,因此必须在客户端请求或指定公钥。如果给出了MASTER_PUBLIC_KEY_PATH并指定了有效的公钥文件,则它优先于GET_MASTER_PUBLIC_KEY。如果您使用的复制用户帐户使用caching_sha2_password插件(MySQL 8.0中的默认插件)进行身份验证,并且您没有使用安全连接,则必须指定此选项或MASTER_PUBLIC_KEY_PATH选项,以向复制副本提供RSA公钥。
如果复制用户的身份验证插件是:caching_sha2_password,则需要指定GET_MASTER_PUBLIC_KEY=1;
CHANGE REPLICATION SOURCE TO SOURCE_HOST='10.10.10.1',SOURCE_PORT=3306,SOURCE_USER='masttos',SOURCE_PASSWORD='1qaz@WSX',SOURCE_LOG_FILE='mysql-bin.000002',SOURCE_LOG_POS=157,GET_MASTER_PUBLIC_KEY=1;
这里要注意:SOURCE_LOG_FILE和SOURCE_LOG_POS,最好从库里查出来。不然对于已经在主从同步的库来说,可能造成主从同步不一致。
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 5.7
# 主库
docker run -v E:\www\sql\rw\master1\data:/var/lib/mysql -v E:\www\sql\rw\master1/conf:/etc/mysql/conf.d -v E:\www\sql\rw\master1\logs:/logs -e MYSQL_ROOT_PASSWORD=root --name master1 -p 3307:3306 -d mysql:5.7
#Linux
docker run --name master1 -it --restart=always -v /www/sql/mysql7/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:5.7
1
2
3
2
3
service mysql restart
chmod 644 /etc/mysql/conf.d/my.cnf
确保在主服务器上 skip_networking 选项处于 OFF 关闭状态, 这是默认值
如果是启用的,则从站无法与主站通信,并且复制失败。
mysql> show variables like '%skip_networking%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| skip_networking | OFF |
+-----------------+-------+
1 row in set (0.01 sec)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
创建同步账户以及授权
create user 'repuser'@'%' identified by 'repuser';
grant replication slave on *.* to 'repuser'@'%';
flush privileges;
1
2
3
2
3
# 从库
docker run --name slave1 -v E:\www\sql\rw\slave1\data:/var/lib/mysql -v E:\www\sql\rw\slave1\conf:/etc/mysql/conf.d -v E:\www\sql\rw\slave1\logs:/logs -e MYSQL_ROOT_PASSWORD=root -p 3308:3306 -d mysql:5.7
1
service mysql restart
#当未读取到服务id时可重启查看日志是否使用到了配置文件
chmod 644 /etc/mysql/conf.d/my.cnf
1
2
3
4
5
2
3
4
5
use mysql; #删除 drop table slave_master_info; drop table slave_relay_log_info; drop table slave_worker_info; drop table innodb_index_stats; drop table innodb_table_stats; #重建 source /usr/share/mysql/mysql_system_tables.sql
# 配置连接到主服务器的相关信息
CHANGE MASTER TO
master_host='192.168.43.29',
master_port=3307,
master_user='repuser',
master_password='repuser';
1
2
3
4
5
6
2
3
4
5
6
# Atlas
与mysql8.0版本匹配不好,会有问题
https://github.com/Qihoo360/Atlas
https://github.com/Qihoo360/Atlas/wiki/Atlas的安装
#下载页面
https://github.com/Qihoo360/Atlas/releases
wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
# 安装
rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
# 卸载
rpm -e Atlas-2.2.1.el6.x86_64.rpm
Atlas的安装目录是/usr/local/mysql-proxy
cd /usr/local/mysql-proxy
# 配置文件
vi /usr/local/mysql-proxy/conf/test.cnf
# 加密
[root@mysqlserver bin]# /usr/local/mysql-proxy/bin/encrypt root
DAJnl8cVzy8=
#启动atlas
# {start|stop|restart|status}
/usr/local/mysql-proxy/bin/mysql-proxyd test start
tail -f /usr/local/mysql-proxy/log/test.log
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21