ubuntu docker mysql主从配置

老子叫甜甜 提交于 2020-08-16 10:28:42

1.拉取MySQL(最新版本)镜像到本地

docker pull mysql # 如果你只需要跑一个mysql实例,不做主从,那么执行以下命令即可,不用再做后面的参考步骤: 
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:latest #然后用shell或客户端软件通过配置( 用户名:root 密码:132456 IP:你的本机ip 端口:3306)来登录即可

2. 准备MySQL配置文件

mysql安装后的默认配置文件在/etc/mysql/my.cnf, 而自定义的配置文件一般放在/etc/mysql/conf.d这个路径下。
现在我们在本地host主机上自定义的某个目录(如/data/mysql/conf/),先创建两个文件master.conf和slave.conf,分别用于配置主从两个节点。

  • /data/mysql/conf/master.conf
[client] 
default-character-set=utf8 
[mysql] 
default-character-set=utf8 
[mysqld] 
log_bin = log #开启二进制日志,用于从节点的历史复制回放 
collation-server = utf8_unicode_ci 
init-connect='SET NAMES utf8' 
character-set-server = utf8 
server_id = 1 #需保证主库和从库的server_id不同, 假设主库设为1 
replicate-do-db=icloud #需要复制的数据库名,需复制多个数据库的话则重复设置这个选项
  • /data/mysql/conf/slave.conf
[client] 
default-character-set=utf8 
[mysql] 
default-character-set=utf8 
[mysqld] 
log_bin = log #开启二进制日志,用于从节点的历史复制回放 
collation-server = utf8_unicode_ci 
init-connect='SET NAMES utf8' 
character-set-server = utf8 
server_id = 2 #需保证主库和从库的server_id不同, 假设从库设为2 
replicate-do-db=icloud #需要复制的数据库名,需复制多个数据库的话则重复设置这个选项

3. Docker分别运行MySQL主/从两个容器

  • 将mysql主节点运行起来
sudo mkdir -p /data/mysql/datam 
sudo docker run -d --name mysql-master -p 13306:3306 -v /data/mysql/conf/master.conf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /data/mysql/datam:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:latest

运行参数说明:

--name mysql-master: 容器的名称设为mysql-master
-p 13306:3306: 将host的13306端口映射到容器的3306端口
-v /data/mysql/conf/master.conf:/etc/mysql/mysql.conf.d/mysqld.cnf : master.conf配置文件挂载
-v /data/mysql/datam:/var/lib/mysql : mysql容器内数据挂载到host的/data/mysql/datam, 用于持久化
-e MYSQL_ROOT_PASSWORD=123456 : mysql的root登录密码为123456

  • 将mysql从节点运行起来
sudo mkdir -p /data/mysql/datas 
sudo docker run -d --name mysql-slave -p 13307:3306 -v /data/mysql/conf/slave.conf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /data/mysql/datas:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:latest

运行参数说明:

--name mysql-slave: 容器的名称设为mysql-slave
-p 13307:3306: 将host的13307端口映射到容器的3306端口
-v /data/mysql/conf/slave.conf:/etc/mysql/mysql.conf.d/mysqld.cnf : slave.conf配置文件挂载
-v /data/mysql/datas:/var/lib/mysql : mysql容器内数据挂载到host的/data/mysql/datas, 用于持久化
-e MYSQL_ROOT_PASSWORD=123456 : mysql的root登录密码为123456

4.登录MySQL主节点配置同步信息#

  • 登录mysql
mysql -u root -h 192.168.1.xx -P13306 -p123456 # 192.168.1.xx 是你本机的内网ip
  • 在mysql client中执行
mysql> CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
mysql> flush privileges;

再获取status, 得到类似如下的输出:

mysql> show master status \G ;
*************************** 1. row *************************** 
File: binlog.000002 
Position: 156 
Binlog_Do_DB: 
Binlog_Ignore_DB: 
Executed_Gtid_Set: 1 row in set (0.00 sec)

 

5.登录MySQL从节点配置同步信息

  • 另开一个tab登录mysql
mysql -u root -h 192.168.1.xx -P13307 -p123456 # 192.168.1.xx 是你本机的内网ip
  • 在mysql client中操作:
mysql> stop slave; #注意其中的日志文件和数值要和上面show master status的值对应 
mysql> CHANGE MASTER TO MASTER_HOST='你的本地ip地址如192.168.1.x',master_port=13306,MASTER_USER='slave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='binlog.000002',MASTER_LOG_POS=156; 
mysql> start slave;

再获取status, 正常应该得到类似如下的输出:

mysql> show slave status \G ;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.XX
                  Master_User: slave
                  Master_Port: 13306
                Connect_Retry: 60
              Master_Log_File: binlog.000002
          Read_Master_Log_Pos: 156
               Relay_Log_File: feb2e3f40b29-relay-bin.000002
                Relay_Log_Pos: 329
        Relay_Master_Log_File: mysql-bin-master.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 656
              Relay_Log_Space: 544
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 100
                  Master_UUID: 31ef5ac8-8d02-11e9-a2f6-0242ac120005
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
1 row in set (0.00 sec)

ERROR: 
No query specified

遇到错误排查:

1、sever_id 相同:

mysql>show variables like 'server_id';

如果主从相同会导致错误,可在从机中设置:

mysql>set global server_id=2;

2.密码编码问题:

通过本地去连接远程的mysql时报错,原因时mysql8.0的加密方法变了。

mysql8.0默认采用caching_sha2_password的加密方式

第三方客户端基本都不支持这种加密方式,只有自带的命令行支持

所以需要修改加密方式。

Last_IO_Errorno:2061
Last_IO_Error:error connection to master 'slave@192.168.1.XX:13305' - retry-time:60 retries 1 message:Authentication plugin 'cachinf_sha2_password' reported error: Authentication requires secure connection .

在主机中设置:

mysql>alter user 'slave'@'%' identified with mysql_native_password by '123456';
mysql>flush privileges;

从机中:

mysql>stop slave;
mysql>start slave;
mysql>show slave status \G;

 

6、添加数据测试

mysql> create database icloud;
mysql> use icloud;
mysql> create table one(id int(10) primary key ,name varchar(11) );
mysql> show tables;
mysql> insert into one (id ,name )values (1,'hello');
mysql> select * form one ;
# 如下:
mysql> select * from one ;
+----+------+
| id | name |
+----+------+
|  1 | hello  |
+----+------+
1 row in set (0.00 sec)

在从机中查看是否同步

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!