docker run -d -p 3361:3306 --name db01 -h db01 --restart=always --net=mynet --ip 172.19.0.61 -v /etc/localtime:/etc/localtime:ro -e MYSQL_ROOT_PASSWORD=wdqdmm@r -e MYSQL_ALLOW_EMPTY_PASSWORD=no -v /data/file:/data/file/ -v /data/docker/mysql/mariadb/50-server.cnf:/etc/mysql/mariadb.conf.d/50-server.cnf:ro -v /data/docker/mysql/mariadb/60-galera-01.cnf:/etc/mysql/mariadb.conf.d/60-galera.cnf mariadb:latest --wsrep-new-cluster
docker run -d -p 3362:3306 --name db02 -h db02 --restart=always --net=mynet --ip 172.19.0.62 -v /etc/localtime:/etc/localtime:ro -e MYSQL_ROOT_PASSWORD=wdqdmm@r -e MYSQL_ALLOW_EMPTY_PASSWORD=no -v /data/file:/data/file/ -v /data/docker/mysql/mariadb/50-server.cnf:/etc/mysql/mariadb.conf.d/50-server.cnf:ro -v /data/docker/mysql/mariadb/60-galera-02.cnf:/etc/mysql/mariadb.conf.d/60-galera.cnf mariadb:latest --wsrep-new-cluster
docker run -d -p 3363:3306 --name db03 -h db03 --restart=always --net=mynet --ip 172.19.0.63 -v /etc/localtime:/etc/localtime:ro -e MYSQL_ROOT_PASSWORD=wdqdmm@r -e MYSQL_ALLOW_EMPTY_PASSWORD=no -v /data/file:/data/file/ -v /data/docker/mysql/mariadb/50-server.cnf:/etc/mysql/mariadb.conf.d/50-server.cnf:ro -v /data/docker/mysql/mariadb/60-galera-02.cnf:/etc/mysql/mariadb.conf.d/60-galera.cnf mariadb:latest --wsrep-new-cluster
docker exec -it db01 /bin/bash
docker exec -it db02 /bin/bash
docker exec -it db03 /bin/bash
apt-get update -y
apt-get install -y wget vim net-tools curl git cron rsync
apt install iputils-ping
apt-get dist-upgrade -y
apt-get upgrade -y
apt autoremove
apt clean
#只有使用--subnet创建的网络才能指定静态IP
docker network create --driver bridge --subnet 172.19.0.0/24 --gateway 172.19.0.1 mynet
# MariaDB-Galera部署
----Galera Cluster的特点
多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的
同步复制:集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失
并发复制:从节点APPLY数据时,支持并行执行,更好的性能
障切换:在出现数据库故障时,因支持多点写入,切换容易
热插拔:在服务期间,如果数据库挂了,只要监控程序发现的够快,不可服务时间就会非常少。在节点故障期间,节点本身对集群的影响非常小
自动节点克隆:在新增节点,或者停机维护时,增量数据或者基础数据不需要人工手动备份提供,Galera Cluster会自动拉取在线节点数据,最终集群会变为一致
对应用透明:集群的维护,对应用程序是透明的
---配置主机对应关系
cat >>/etc/hosts<<"EOF"
192.168.142.136 db136
192.168.142.137 db137
192.168.142.138 db138
EOF
---配置公钥认证(可选)
ssh-keygen # 一路回车即可(三台机器都需要操作)
ssh-copy-id -i ~/.ssh/id_rsa.pub db137 (只需要在第一台操作)
ssh-copy-id -i ~/.ssh/id_rsa.pub db138 (只需要在第一台操作)
-验证登录
ssh root@db137
ssh root@db138
---三台数据库使用同样的配置文件
# vim /data/docker/mysql/mariadb/60-galera.cnf
[galera]
# Mandatory settings
wsrep_on = ON
wsrep_cluster_name = "MariaDB Galera"
wsrep_provider=/usr/lib/galera/libgalera_smm.so
#本机的ip 不要放在第一位
wsrep_cluster_address = "gcomm://127.0.0.1:4567,127.0.0.1:4568,127.0.0.1:4569"
binlog_format = row
default_storage_engine = InnoDB
innodb_autoinc_lock_mode = 2
wsrep_causal_reads=ON
# Allow server to accept connections on all interfaces.
bind-address = 0.0.0.0
# Optional settings
wsrep_slave_threads = 1
innodb_flush_log_at_trx_commit = 0
wsrep_sst_method=rsync
wsrep_sst_auth=root:wdqdmm@r
[galera]
wsrep_on=ON
wsrep_cluster_name=”cluster”
wsrep_provider=/usr/lib/galera/libgalera_smm.so #galera的库文件的地址
wsrep_cluster_address="gcomm://192.168.206.3,192.168.206.5,192.168.206.6" #各节点的ip
wsrep_node_name=node1 #当前节点主机名
wsrep_node_address=192.168.206.3 #当前节点IP
binlog_format=row #二进制日志设置为行模式 row (安全性最高,性能最低)
default_storage_engine=InnoDB #使用的默认引擎 innoDB 支持事务
innodb_autoinc_lock_mode=2 #2为性能最好
bind-address=0.0.0.0 #本台机器所有网卡
wsrep_slave_threads=1 #并发线程数
innodb_flush_log_at_trx_commit=0
#0.log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行。
该模式下在事务提交的时候,不会主动触发写入磁盘的操作,
#1:每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去,
该模式为系统默认。
#2:每次事务提交时MySQL都会把log buffer的数据写入log file,但是flush(刷到磁盘)操作并不会同时进行。
该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作
innodb_buffer_pool_size=120M #设置缓存池大小
#state_snapshot_transfer(SST)使用的传输方法,
#可用方法有mysqldump、rsync和xtrabackup,
#前两者在传输时都需要对Donor加全局只读锁(FLUSH TABLES WITH READ LOCK),
#xtrabackup则不需要(它使用percona自己提供的backup lock)。强烈建议采用xtrabackup
wsrep_sst_method=rsync #复制方式为rsync,要确保安装了rsync
wsrep_sst_auth=sst:123456 #节点N的数据库账户和密码
wsrep_causal_reads=ON
#避免各个节点的数据不一致,这种情况需要等待全同步复制 将此文件复制到master1、master2,
#pxc_strict_mode=ENFORCING #PXC严格模式,建议开启
#注意要把 wsrep_node_name 和 wsrep_node_address 改成相应节点的 hostname 和 ip。
注:graler 集群最好至少三个,两个的话。如果出现网络波动可能会出现脑裂;
---重置仲裁将主组件引导到最高级的节点上
set global wsrep_provider_options='pc.bootstrap=yes
---启动服务
首次启动时,需要初始化集群,在其中一个节点上执行命令
/etc/init.d/mysql start --wsrep-new-cluster
-而后正常启动其它节点
service mysql start
---验证
show status like "wsrep_ready"; # 查看是否启用galera插件, ON表示是
show status like 'wsrep_cluster_size'; # 这里应该显示集群里有3个节点
show status like 'wsrep_connected'; # 这里应该显示ON
show status like 'wsrep_local_state_comment'; # 当前的节点是正常提供服务的状态,且与集群数据状态是一致的
show status like 'wsrep_cluster_status'; # 集群的目前状态,PRIMARY(正常)/NON_PRIMARY(不一致)
show status like 'wsrep_incoming_addresses'; # 查看集群节点ip
Open:节点启动成功,尝试连接到集群
Primary: 节点已处于集群中,在新节点加入时,选取donor进行数据库同步时会产生的状态
Joiner: 节点处于等待接收或正在接收同步文件的状态
Joined: 节点完成数据同步,但还有部分数据不是最新的,在追赶与集群数据一致的状态
Synced: 节点正常提供服务的状态,表示当前节点数据状态与集群数据状态是一致的
Donor: 表示该节点被选为Donor节点,正在为新加进来的节点进行全量数据同步,此时该节点对客户端不提供服务
---查看集群全部相关状态参数
show status like 'wsrep_%';
-正常的集群显示结果:
wsrep_connected = on 链接已开启
wsrep_cluster_size =2 集群中节点的数量
wsrep_incoming_addresses=ip1,ip2
---端口
3306:数据库对外服务的端口号
4444:请求SST SST: 指数据一个镜象传输 xtrabackup , rsync ,mysqldump 在新节点加入时起作用
4567: 组成员之间进行沟通的一个端口号
4568: 传输IST用的。相对于SST来说的一个增量 ,节点下线,重启加入时起作用
---名词:
WS:write set 写数据集
IST: Incremental State Transfer 增量同步
SST:State Snapshot Transfer 全量同步