docker-compose创建msyql主从集群(mha)

docker-compose创建msyql主从集群(mha)

1、 为容器创建docker网络

docker network create basenetwork --subnet=172.18.0.0/16

2、编写docker的编排文件

文件夹结构:

mysql
|-- master0
|-- |-- conf
|-- |-- |-- my.cnf
|-- |-- data
|-- |-- initdb #需要初始化的数据库脚本存放文件夹,容器启动后会自动执行。
|-- |-- log
|-- |-- scripts
|-- slave01
|-- |-- conf
|-- |-- |-- my.cnf
|-- |-- data
|-- |-- initdb
|-- |-- log
|-- |-- scripts
|-- slave02
|-- |-- conf
|-- |-- |-- my.cnf
|-- |-- data
|-- |-- initdb
|-- |-- log
|-- |-- scripts
|-- slave02
|-- |-- conf
|-- |-- |-- my.cnf
|-- |-- data
|-- |-- initdb
|-- |-- log
|-- |-- scripts
|-- master1
|-- |-- conf
|-- |-- |-- my.cnf
|-- |-- data
|-- |-- initdb
|-- |-- log
|-- |-- scripts
|-- slave11
|-- |-- conf
|-- |-- |-- my.cnf
|-- |-- data
|-- |-- initdb
|-- |-- log
|-- |-- scripts
|-- slave12
|-- |-- conf
|-- |-- |-- my.cnf
|-- |-- data
|-- |-- initdb
|-- |-- log
|-- |-- scripts
|-- slave12
|-- |-- conf
|-- |-- |-- my.cnf
|-- |-- data
|-- |-- initdb
|-- |-- log
|-- |-- scripts
docker-compose.yaml

mysql配置文件:

###服务端配置
# select @@basedir;   /usr/
# show variables like '%plugin%'; /usr/lib/mysql/plugin/
# select @@datadir; /var/lib/mysql/

[mysqld]
server-id=1
port = 3306
# 启动mysql服务进程的用户
user = mysql
# 设置mysql的安装目录.
basedir=/usr/
# 设置mysql数据库的数据的存放目录------------无效
datadir=/var/lib/mysql/
# 临时目录 比如load data infile会用到,一般都是使用/tmp
#tmpdir=/tmp

log_timestamps=SYSTEM
bind-address = 0.0.0.0

pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock


#数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
character-set-server = utf8
#数据库字符集对应一些排序等规则,注意要和character-set-server对应
collation-server = utf8_general_ci
# 设置client连接mysql时的字符集,防止乱码
# init_connect='SET NAMES utf8'
# 是否对sql语句大小写敏感,默认值为0,1表示不敏感
lower_case_table_names = 1



##########################################################################################################
# 内存,cache与buffer设置





##########################################################################################################
# 日志文件相关设置,一般只开启三种日志,错误日志,慢查询日志,二进制日志。普通查询日志不开启。

# 普通查询日志,默认值off,不开启
general_log = 1
# 普通查询日志存放地址
general_log_file = /usr/local/mysql/log/mysql-general.log

# 全局动态变量,默认3,范围:1~3
# 表示错误日志记录的信息,1:只记录error信息;2:记录error和warnings信息;3:记录error、warnings和普通的notes信息。
log_error_verbosity = 2
# 错误日志文件地址
log_error = /usr/local/mysql/log/mysql-error.log


# 开启慢查询
slow_query_log = 1
# 开启慢查询时间,此处为1秒,达到此值才记录数据
long_query_time = 2

# 检索行数达到此数值,才记录慢查询日志中
min_examined_row_limit = 100

# mysql 5.6.5新增,用来表示每分钟允许记录到slow log的且未使用索引的SQL语句次数,默认值为0,不限制。
log_throttle_queries_not_using_indexes = 0

# 慢查询日志文件地址
slow_query_log_file = /usr/local/mysql/log/mysql-slow.log

# 开启记录没有使用索引查询语句
log-queries-not-using-indexes = 1


# 开启二进制日志
log_bin = /usr/local/mysql/log/mysql-bin.log
# mysql清除过期日志的时间,默认值0,不自动清理,而是使用滚动循环的方式。
#expire-logs-days:被binlog_expire_logs_seconds替代,但是MySQL 8.0 下 expire-logs-days尚被支持 如果要管理binlog,参数为:skip-log-bin = 1

# 如果二进制日志写入的内容超出给定值,日志就会发生滚动。你不能将该变量设置为大于1GB或小于4096字节。 默认值是1GB。
max_binlog_size = 1000M
# binlog的格式也有三种:STATEMENT,ROW,MIXED。mysql 5.7.7后,默认值从 MIXED 改为 ROW
# 关于binlog日志格式问题,请查阅网络资料
binlog_format = row
# 默认值N=1,使binlog在每N次binlog写入后与硬盘同步,ps:1最慢
sync_binlog = 1 
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=sys


#relay_log配置 MySQL进行主主复制或主从复制的时候会在home目录下面产生相应的relay log
#定义relay_log的位置和名称,如果值为空,则默认位置在数据文件的目录
relay_log=/usr/local/mysql/log/mysql-relay-bin.log
#将从主库获得的变更信息在重新写入从库的binlog日志中,默认关闭
# log_replica_updates=1
#是否自动清空不再需要中继日志时。默认值为1(启用)
relay_log_purge=0



# 自动开启半同步复制 
# rpl_semi_sync_source_enabled=ON
# rpl_semi_sync_source_timeout=1000
# 自动开启半同步复制 
# rpl_semi_sync_replica_enabled=ON

docker编排文件:

docker-compose.yaml

version: "3.9"  # optional since v1.27.0
services:
  mysql-master1:
    image: mysql:8.0.27
    #user: mysql:mysql
    privileged: true
    #network_mode: "host" # 如果需要容器使用宿主机IP(内网IP),则可以配置此项
    hostname: mysql-master1
    container_name: mysql-master1 # 指定容器名称,如果不设置此参数,则由系统自动生成
    # command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci # 设置utf8字符集
    entrypoint: bash -c "chown -R mysql:mysql /usr/local/mysql && exec /entrypoint.sh mysqld"
    environment:
      - MYSQL_ROOT_PASSWORD=141535 # 设置root密码
    volumes:
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
      - ./mysql/master1/data:/var/lib/mysql/ # 映射数据库保存目录到宿主机,防止数据丢失
      - ./mysql/master1/conf/my.cnf:/etc/my.cnf # 映射数据库配置文件
      - ./mysql/master1/log:/usr/local/mysql/log
      # - ./mysql/master/initdb:/docker-entrypoint-initdb.d # 需要初始化的数据库脚本存放文件夹,容器启动后会自动执行。
      # - ./mysql/master/script:/usr/local/mysql/script # 映射本地数据库脚本到宿主机,方便执行
    ports:
      - "3309:3306"
    #定义IP网络
    networks:
      basenetwork:
        ipv4_address: 172.18.0.13

  mysql-slave11:
    image: mysql:8.0.27
    #user: mysql:mysql
    privileged: true
    #network_mode: "host" # 如果需要容器使用宿主机IP(内网IP),则可以配置此项
    hostname: mysql-slave11
    container_name: mysql-slave11 # 指定容器名称,如果不设置此参数,则由系统自动生成
    # entrypoint: bash -c "chown -R mysql:mysql /usr/local/mysql && exec /entrypoint.sh mysqld"
    environment:
      - MYSQL_ROOT_PASSWORD=141535 # 设置root密码
    volumes:
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
      - ./mysql/slave11/data:/var/lib/mysql # 映射数据库保存目录到宿主机,防止数据丢失
      - ./mysql/slave11/conf/my.cnf:/etc/my.cnf # 映射数据库配置文件
      - ./mysql/slave11/log:/usr/local/mysql/log
    ports:
      - "3310:3306"
    #定义IP网络
    networks:
      basenetwork:
        ipv4_address: 172.18.0.14

  mysql-slave12:
    image: mysql:8.0.27
    #user: mysql:mysql
    privileged: true
    #network_mode: "host" # 如果需要容器使用宿主机IP(内网IP),则可以配置此项
    hostname: mysql-slave12
    container_name: mysql-slave12 # 指定容器名称,如果不设置此参数,则由系统自动生成
    # entrypoint: bash -c "chown -R mysql:mysql /usr/local/mysql && exec /entrypoint.sh mysqld"
    environment:
      - MYSQL_ROOT_PASSWORD=141535 # 设置root密码
    volumes:
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
      - ./mysql/slave12/data:/var/lib/mysql # 映射数据库保存目录到宿主机,防止数据丢失
      - ./mysql/slave12/conf/my.cnf:/etc/my.cnf # 映射数据库配置文件
      - ./mysql/slave12/log:/usr/local/mysql/log
    ports:
      - "3311:3306"
    #定义IP网络
    networks:
      basenetwork:
        ipv4_address: 172.18.0.15

 

#定义网络。 docker network create basenetwork --subnet=172.18.0.0/16
networks:
  basenetwork:
    external: true
  #     ipam:
  #      config:
  #代表网段的CIDR格式的子网
  #       - subnet: 172.20.1.0/24
  #        gateway: 172.20.1.1

#########******************
# 注意:
#1、my.cnf不能有w的权限,否则不会生效; https://blog.csdn.net/z17815950792/article/details/116230223
#2、集群搭建;https://www.jb51.net/article/218417.html

#集群启动成功后,进入mysql的master容器,登录mysql然后创建复制权限的账户
CREATE USER reader IDENTIFIED BY 'reader';
GRANT REPLICATION SLAVE ON *.* to 'reader'@'%';
FLUSH PRIVILEGES;
#注意,mysql8似乎是有bug,创建完的账号必须在mysql的master登录下,后续在slave节点里加入主从集群的时候才不会报错。如果在slave加入主从集群时仍然无法加入并报账号认证相关错误时,在slave节点进行登录,使用mysql -ureader -h mysql-master0进行登录,先登录一次然后退出再执行加入主从集群命令。
#查看主节点的信息
show master status;

#进入相关的slave节点
change master to master_host='mysql-master1',master_user='reader',master_password='reader',master_log_file='mysql-bin.000011',master_log_pos=2294;
start slave;
show slave status\G;
# reset slave all;删除所有主从同步信息


#########******************
# install plugin rpl_semi_sync_master soname 'semisync_master.so';
# show variables like '%semi%';


3、搭建mha高可用

mha( master high availablity) 是一套成熟的mysql高可用方案,可以实现故障切换以及主节点切换。
主要有两部分组成:mha manager和mha node,其中manager需要单独部署,每个mysql服务都是node。

该部分操作比较繁琐,可以参考大神文章
docker搭建Mysql主从MHA高可用集群_ksisn的博客-CSDN博客_docker mysql 高可用

3.1、安装并启动ssh服务,设置好免密登录;

/etc/init.d/ssh restart
#测试ssh连接 每台机器开启ssh
service ssh start

#修改root账号密码

docker exec -it bash
root@MyContainer:/# passwd
Enter new UNIX password:
Retype new UNIX password:

chmod 600 /root/.ssh/authorized_keys

3.2、在3台服务器都创建好用户,用于主从复制(创建好之后,要分别登录)
CREATE USER reader IDENTIFIED BY 'reader';
GRANT REPLICATION SLAVE ON *.* to 'reader'@'%';
FLUSH PRIVILEGES;
3.3、在3台服务器上安装半同步插件,master和slave插件都安装,并设置配置文件;

这里主要参考 docker搭建Mysql主从MHA高可用集群_ksisn的博客-CSDN博客_docker mysql 高可用

3个mysql容器的配置文件独立。

3.4、在3台mysql服务器+1台mha服务器上,都安装mha node
#安装依赖perl
apt-get install libdbd-mysql-perl -y
#安装mha4mysql-node
apt-get install mha4mysql-node -y
3.5、mha服务器安装MHA manager,设置配置文件
apt-get install mha4mysql-manager -y

touch /etc/mha-manager-cnf/manage.cnf

配置信息如下:

[server default]
#MHA监控实例根目录
manager_workdir=/var/log/mha/app1
#MHA监控实例日志文件
manager_log=/var/log/mha/app1/manager.log
#主库用户名,在master mysql的主库执行下列命令建一个新用户
user=root 
password=141535
#ssh登录账号
ssh_user=root
#从库复制账号和密码
repl_user=reader
repl_password=reader
port=3306
#ping次数
ping_interval=1



#[serverx] 服务器编号 #hostname 主机名 #candidate_master 可以做主库 #master_binlog_dir binlog日志文件目录
[server1]
hostname=mysql-master
candidate_master=1
master_binlog_dir=/usr/local/mysql/log
port=3306

[server2]
hostname=mysql-slave1
candidate_master=1
master_binlog_dir=/usr/local/mysql/log
port=3306

[server3]
hostname=mysql-slave2
candidate_master=1
master_binlog_dir=/usr/local/mysql/log
port=3306
3.6、执行以下命令
# 检查SSH配置免费互通
masterha_check_ssh --conf=/etc/mha-manager-cnf/manage.cnf 
#[info] All SSH connection tests passed successfully.

# 验证配置
masterha_check_repl --conf=/etc/mha-manager-cnf/manage.cnf
# 运行
masterha_manager --conf=/etc/mha-manager-cnf/manage.cnf &
#####
nohup masterha_manager --conf=/etc/mha-manager-cnf/manage.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log
##查看监控状态
masterha_check_status --conf=/etc/mha-manager-cnf/manage.cnf
##关闭
masterha_stop --conf=/etc/mha-manager-cnf/manage.cnf

问题:

使用 masterha_check_repl 时一直报错

# masterha_check_repl --conf=/etc/masterha/app1/app1.cnf
Fri Mar  8 11:31:29 2019 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri Mar  8 11:31:29 2019 - [info] Reading application default configuration from /etc/masterha/app1/app1.cnf..
Fri Mar  8 11:31:29 2019 - [info] Reading server configuration from /etc/masterha/app1/app1.cnf..
Fri Mar  8 11:31:29 2019 - [info] MHA::MasterMonitor version 0.58.
Fri Mar  8 11:31:30 2019 - [error][/usr/share/perl5/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations. Redundant argument in sprintf at /usr/share/perl5/MHA/NodeUtil.pm line 201.
Fri Mar  8 11:31:30 2019 - [error][/usr/share/perl5/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
Fri Mar  8 11:31:30 2019 - [info] Got exit code 1 (Not master dead).

MySQL Replication Health is NOT OK!

须要对 /usr/share/perl5/MHA/NodeUtil.pm 修改

# vi /usr/share/perl5/MHA/NodeUtil.pm

sub parse_mysql_major_version($) {
  my $str = shift;
  my $result = sprintf( '%03d%03d', $str =~ m/(\d+)/g );
  return $result;
}

修改成:

sub parse_mysql_major_version($) {
  my $str = shift;
  $str =~ /(\d+)\.(\d+)/;
  my $strmajor = "$1.$2";
  my $result = sprintf( '%03d%03d', $strmajor =~ m/(\d+)/g );
  return $result;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值