- MySQL集群配置
- Redis集群配置
- RocketMQ
- 配置Nacos
- Nginx高可用负载
- 📢文章总结
- 📥博主目标
🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。
💡在这个美好的时刻,本人不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。
🥤本文内容
MySQL集群配置
云服务器选购
CPU选择
可以看到除了IO线程的其他线程,都只占一个线程,io线程有四个,其中write和read需要相同的数量。
如果是master thread1条,IO thread(write1条,read1条,insert buffer thread1条,log io thread1条),purge thread1条,page cleaner thread1条,给它凑个整,就是8核cpu。
如果是master thread1条,IO thread(write5条,read5条,insert buffer thread1条,log io thread1条),purge thread1条,page cleaner thread1条,给它凑个整就是16核cpu。
这里为了部署集群,我选择八核,最大化利用cpu资源的同时也能节约成本。
内存选择
MySQL服务器的最佳内存配置实际上并没有一个固定的答案,因为它取决于多个因素,如服务器的物理内存大小、MySQL的配置文件、所处理的数据量、工作负载、查询的复杂性以及期望的性能等。
一般来说,根据MySQL官方文档的建议,一个典型的MySQL服务器至少需要2GB的物理内存。但在实际应用中,这个数字可能会更高,特别是当MySQL服务器需要处理大量的数据时。例如,如果MySQL需要处理1GB的数据,那么至少需要4GB的物理内存。
InnoDB存储引擎使用缓冲池(Buffer Pool)来缓存数据和索引,因此为InnoDB配置足够的内存是非常重要的。通常,一个好的起点是将总内存的50%到80%分配给MySQL的InnoDB缓冲池。你可以使用SHOW ENGINE INNODB STATUS命令来查看当前Buffer pool的使用情况,以便根据实际情况调整配置。
此外,除了InnoDB缓冲池外,MySQL还需要内存来存储其他信息,如线程堆栈、排序缓冲区、连接缓冲区等。因此,在配置内存时,需要确保为这些操作预留足够的内存。
请注意,内存配置只是MySQL性能调优的一部分。你还需要考虑其他因素,如磁盘I/O、CPU、网络等。在调整任何配置之前,最好先在测试环境中进行验证,以确保更改不会对生产环境造成负面影响。
前面我选择了八核的cpu,那么对应的云服务器选择就少很多了
由于需要部署集群,单台服务器肯定是不够的,所以考虑到成本,这里选择经济型,16GiB内存就够了。
云盘选择
ESSD AutoPL云盘
如果不开启预配置性能只有6800的IOPS,如果开启最高的预配置性能有56800,但是价格也会高出不少。云盘才0.21元一个小时,预配置性能则高达3.125元一小时。
块存储性能(ESSD)
ESSD Entry的IOPS要低很多,价格也便宜
ESSD云盘,上限的IOPS是五万,正常运行的IOPS是6800,综合而已,选择这宽经济实惠,也能满足一定的IOPS。
这里说一下IOPS:
IOPS,即Input/Output Operations Per Second,是一个用于计算机存储设备(如硬盘(HDD)、固态硬盘(SSD)或存储区域网络(SAN))性能测试的量测方式,可以视为是每秒的读写次数。这是一个衡量随机存取性能的关键指标,常用于数据库和应用程序工作负载,因为这些应用通常需要快速的随机读写。
IOPS的数值会根据读写操作的大小和类型(随机或顺序)而变化。因此,当比较或评估IOPS时,应确保在相同的条件下进行。此外,IOPS和吞吐量都是描述存储性能的指标,但它们衡量的是不同的操作和应用场景。
镜像选择
首先我这里选择的是CentOS7.9版本,虽然CentOS官方不再进行新的维护了。具体来说,CentOS 7将在2024年6月30日停止维护(EOL, End Of Life),而CentOS 8在2021年底就已经停止了维护。尽管CentOS不再进行新的维护,但已经安装和运行的CentOS系统仍然可以继续使用。
同时CentOS的普及率也有一定程度了,加上大部分开发者对CentOS也是比较熟悉,网上也有很多前辈踩过坑,所以我依然选择这个镜像,就是为了保证稳定性以及遇到问题可以即时检索出答案。
带宽选择
首先,需要估计每个I/O操作平均需要传输多少数据。然后将这个数字乘以预期的IOPS来得到一个粗略的带宽需求估计。
例如,如果每个I/O操作平均传输1KB的数据,并且你预计在高并发时会有10000的IOPS,那么你需要的带宽大约是10MBps(10000 * 1KB/s)。
这里我按照顶额处理给到100MBps,因为是按量付费,选择10MBps和100MBps价格都不变,变的是使用的量。
密码配置
企业级通常使用密钥对保证安全性,我这里因为就是简单做个压测,就直接使用密码了。
这里提供一个生成密码的网站:https://suijimimashengcheng.bmcx.com/
9ND%8cnNyAr!##ptRz^n@tbRLf$dsau%
注意事项
购买阿里云服务器,账户最少100元才可以购买。
另外这二个配置一定加上
避免扣钱过度
安装docker和docker-compose
在Linux服务器上安装Docker的命令主要包括以下步骤:
检查CentOS系统的内核版本是否高于3.10,因为Docker要求CentOS系统的内核版本高于3.10。可以使用uname -r命令来查看当前的内核版本。
更新yum包,使用命令sudo yum update
。
安装必要的软件包,包括yum-utils(提供yum-config-manager功能)、device-mapper-persistent-data和lvm2。使用命令
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
设置yum源,以便可以从Docker的官方仓库中安装Docker。使用命令
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
查看所有可用的Docker版本,以便可以选择要安装的特定版本。使用命令
yum list docker-ce --showduplicates | sort -r
安装Docker CE(社区版)。如果要安装特定版本,可以在安装命令中指定版本号。使用命令
sudo yum install docker-ce docker-ce-cli containerd.io
进行安装。
启动Docker服务,使用命令systemctl start docker
。
查看Docker版本信息,使用命令docker version。如果看到版本号,表示安装成功。
配置开机自启动
systemctl enable docker.service
请注意,安装Docker的过程中可能需要根据提示输入“y”以继续安装过程。此外,如果服务器开启了防火墙,需要在安装前关闭防火墙,并确保禁止开机启动防火墙,以避免影响Docker的正常运行。
这些步骤是Linux服务器上安装Docker的基本命令,具体步骤可能会因服务器环境和版本的不同而有所差异。在安装过程中,建议仔细阅读命令的输出信息,并根据需要进行适当的调整。
具体操作:https://blog.csdn.net/java_wxid/article/details/121317129
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker.service
systemctl daemon-reload
systemctl start firewalld
systemctl enable firewalld
docker version
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
sudo systemctl restart docker
部署MySQL三主六从半同步集群
一主二从同步集群规划
master节点:ip地址:8.134.108.60 mysql端口:33061
slave1节点:ip地址:8.134.108.60 mysql端口:33062
slave2节点:ip地址:8.134.108.60 mysql端口:33063
服务器登录的用户名密码都是root用户admin密码
master节点的mysql登录账户是root用户masterroot密码
slave1节点和slave2节点的mysql登录账户是root用户slaveroot密码
mkdir -p /var/lib/mysql
sudo useradd -r -s /sbin/nologin -d /var/lib/mysql mysql
sudo chmod -R 755 /var/lib/mysql
grep mysql /etc/passwd
sudo usermod -d /var/lib/mysql mysql
sudo setenforce 0
部署node1节点的master1
docker-compose.yaml文件
编辑docker-compose.yaml文件,代码如下:
mkdir -p /var/lib/mysql
chmod 755 /var/lib/mysql
mkdir -p /opt/software/mysqlcluster/master1
cd /opt/software/mysqlcluster/master1
vi docker-compose.yaml
文件内容,代码如下:
version: '3' # 使用docker-compose版本3
services: # 定义服务
mysql_master: # 定义一个名为mysql\_master的服务
image: mysql:8.0.20 # 使用MySQL 8.0.20镜像
container_name: mysql_node1_master1 # 指定容器名称为mysql\_node1\_master1
restart: unless-stopped # 在容器退出时自动重新启动
ports: # 定义容器和主机之间的端口映射
- "33061:3306" # 将容器的3306端口映射到主机的33061端口
environment: # 定义环境变量
MYSQL_ROOT_PASSWORD: node1master1root # 设置root用户的密码
volumes: # 定义数据卷
- /var/lib/mysql:/var/lib/mysql # 数据目录
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "-u", "root", "-pnode1master1root"] # 设置容器健康检查命令
interval: 20s # 每隔20秒进行一次健康检查
timeout: 10s # 健康检查超时时间为10秒
retries: 3 # 健康检查失败时重试次数为3次
授权文件
sudo chmod 777 docker-compose.yaml
mkdir /opt/software/mysqlcluster/master1/conf
vi /opt/software/mysqlcluster/master1/conf/my.cnf
my.cnf文件
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
symbolic-links=0
default-storage-engine = InnoDB # 默认存储引擎
server_id = 1010 # 服务器的唯一标识符
bind-address = 0.0.0.0 # 服务器监听的IP地址
port = 3306 # 服务器监听的端口号
character-set-server = utf8mb4 # 服务器使用的字符集
skip-external-locking # 不使用外部锁定
skip-name-resolve # 不进行域名解析
log-bin = mysql-bin # 启用二进制日志
log-bin-trust-function-creators = 1 # 允许二进制日志中记录函数创建的事件
max_connections = 2000 # 最大连接数
max_user_connections = 1000 # 单个用户最大连接数
max_connect_errors = 4000 # 最大连接错误数
wait_timeout = 300 # 空闲连接的超时时间
interactive_timeout = 600 # 交互式连接的超时时间
table_open_cache = 512 # 表缓存大小
max_allowed_packet = 32M # 最大允许的数据包大小
sort_buffer_size = 2M # 排序缓冲区大小
join_buffer_size = 2M # 连接缓冲区大小
thread_cache_size = 8 # 线程缓存大小
sync_binlog = 0 # 数据刷盘参数=0时,由文件系统控制写盘的频率,并发性能最好,但是意外丢失数据的风险最大
gtid_mode = ON # 开启GTID模式,用于自动处理复制中的事务
enforce_gtid_consistency = ON # GTID\_MODE 和 ENFORCE\_GTID\_CONSISTENCY 的设置是一致的,强制全局事务标识的一致性
# 日志设置
log-short-format = 1 # 使用短格式记录日志
slow_query_log # 启用慢查询日志
long_query_time = 2 # 慢查询的时间阈值
# 二进制日志设置
log_bin_trust_function_creators=1 # 允许二进制日志中记录函数创建的事件
binlog_format = MIXED # 二进制日志格式
binlog_expire_logs_seconds = 864000 # 二进制日志过期时间(单位:秒)
# InnoDB特定选项
innodb_buffer_pool_size = 4G # InnoDB缓冲池大小
innodb_thread_concurrency = 8 # InnoDB线程并发数
innodb_flush_method = O\_DIRECT # InnoDB刷新日志的方法
innodb_flush_log_at_trx_commit = 1 # 控制事务日志的同步方式
innodb_log_buffer_size = 128M # InnoDB日志缓冲区大小
innodb_log_file_size = 256M # InnoDB日志文件大小
innodb_log_files_in_group = 3 # InnoDB日志文件组中的文件数
innodb_max_dirty_pages_pct = 90 # InnoDB脏页的最大比例
innodb_lock_wait_timeout = 50 # InnoDB锁等待超时时间(单位:秒)
innodb_file_per_table = 1 # 每个表使用独立的表空间文件
plugin-load = rpl_semi_sync_master.so # 配置半同步复制
# rpl_semi_sync_master_enabled = 1 # 开启半同步复制
# rpl_semi_sync_master_timeout = 5000 # 配置主从同步超时时间(毫秒)
[mysqldump]
quick # 快速导出数据
max_allowed_packet = 16M # 最大允许的数据包大小
[myisamchk]
key_buffer_size = 256M # MyISAM键缓冲区大小
sort_buffer_size = 256M # MyISAM排序缓冲区大小
read_buffer = 2M # MyISAM读缓冲区大小
write_buffer = 2M # MyISAM写缓冲区大小
[mysqlhotcopy]
interactive-timeout = 3600 # 交互式超时时间,超时时间设置为 1 小时
授权启动
sudo chmod 644 /opt/software/mysqlcluster/master1/conf/my.cnf
docker-compose up -d
docker-compose ps
sudo chown -R mysql:mysql /var/lib/mysql
复制配置文件my.cnf到容器中
docker cp /opt/software/mysqlcluster/master1/conf/my.cnf mysql_node1_master1:/etc/mysql/my.cnf
重启容器
docker restart mysql_node1_master1
进入主节点容器,命令如下:
docker exec -it mysql_node1_master1 bash
登录mysql,命令如下:
mysql -u root -pnode1master1root
参考server_id是否配置正确,判断my.cnf是否生效
SHOW VARIABLES LIKE 'server_id';
安装semisync_master模块,通过扩展库来安装半同步复制模块,需要指定扩展库的文件名,命令如下:
install plugin rpl_semi_sync_master soname 'semisync\_master.so';
查看系统全局参数,命令如下:
show global variables like 'rpl\_semi%';
输出结果如下:
mysql> show global variables like 'rpl_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.00 sec)
rpl_semi_sync_master_timeout就是半同步复制时等待应答的最长等待时间,默认是10秒,可以根据情况自行调整。rpl_semi_sync_master_wait_point其实表示一种半同步复制的方式。半同步复制有两种方式,一种是我们现在看到的这种默认的AFTER_SYNC方式。这种方式下,主库把日志写入binlog,并且复制给从库,然后开始等待从库的响应。从库返回成功后,主库再提交事务,接着给客户端返回一个成功响应。而另一种方式是叫做AFTER_COMMIT方式。他不是默认的。这种方式,在主库写入binlog后,等待binlog复制到从库,主库就提交自己的本地事务,再等待从库返回给自己一个成功响应,然后主库再给客户端返回响应。
打开半同步复制的开关,命令如下:
set global rpl\_semi\_sync\_master\_enabled=ON;
授权,命令如下:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'node1master1root';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'node1master1root';
FLUSH PRIVILEGES;
查看master节点状态
show master status;
输出结果:
mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000003 | 196 | | | 7410e8b2-e12b-11ee-9499-0242ac160002:1-3 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
mysql>
退出容器将my.cnf文件中的:
# rpl\_semi\_sync\_master\_enabled = 1 # 开启半同步复制
# rpl\_semi\_sync\_master\_timeout = 5000 # 配置主从同步超时时间(毫秒)
打开:
rpl_semi_sync_master_enabled = 1 # 开启半同步复制
rpl_semi_sync_master_timeout = 5000 # 配置主从同步超时时间(毫秒)
重启master节点的mysql服务,命令如下:
docker restart mysql_node1_master1
部署node1节点的slave1
docker-compose.yaml文件
编辑docker-compose.yaml文件,代码如下:
mkdir -p /var/lib/mysqlslave1
ls -ld /var/lib/mysqlslave1/
chmod 755 /var/lib/mysqlslave1/
ls -ld /var/lib/mysqlslave1/
mkdir -p /opt/software/mysqlcluster/slave1
cd /opt/software/mysqlcluster/slave1
vi docker-compose.yaml
文件内容,代码如下:
version: '3' # 使用docker-compose版本3
services: # 定义服务
mysql_master: # 定义一个名为mysql\_master的服务
image: mysql:8.0.20 # 使用MySQL 8.0.20镜像
container_name: mysql_node1_slave1 # 指定容器名称为mysql\_node2\_slave1
restart: unless-stopped # 在容器退出时自动重新启动
ports: # 定义容器和主机之间的端口映射
- "33064:3309" # 将容器的3306端口映射到主机的33061端口
environment: # 定义环境变量
MYSQL_ROOT_PASSWORD: node1slave1root # 设置root用户的密码
volumes: # 定义数据卷
- /var/lib/mysqlslave1:/var/lib/mysql # 数据目录
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "-u", "root", "-pnode1slave1root"] # 设置容器健康检查命令
interval: 20s # 每隔20秒进行一次健康检查
timeout: 10s # 健康检查超时时间为10秒
retries: 3 # 健康检查失败时重试次数为3次
授权文件
sudo chmod 777 docker-compose.yaml
mkdir -p /opt/software/mysqlcluster/slave1/conf
vi /opt/software/mysqlcluster/slave1/conf/my.cnf
my.cnf文件
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
symbolic-links=0
default-storage-engine = InnoDB # 默认存储引擎
server_id = 1011 # 服务器的唯一标识符
bind-address = 0.0.0.0 # 服务器监听的IP地址
port = 3309 # 服务器监听的端口号
character-set-server = utf8mb4 # 服务器使用的字符集
skip-external-locking # 不使用外部锁定
skip-name-resolve # 不进行域名解析
relay_log = relay-log # 开启中继日志
relay_log_index = slave-relay-bin.index # 设置中继日志索引的文件名
read_only = ON # 启用只读属性
relay_log_purge = 0 # 是否自动清空不再需要中继日志
log_slave_updates=1 # 开启从服务器记录二进制日志更新的功能
max_connections = 2000 # 最大连接数
max_user_connections = 1000 # 单个用户最大连接数
max_connect_errors = 4000 # 最大连接错误数
wait_timeout = 300 # 空闲连接的超时时间
interactive_timeout = 600 # 交互式连接的超时时间
table_open_cache = 512 # 表缓存大小
max_allowed_packet = 32M # 最大允许的数据包大小
sort_buffer_size = 2M # 排序缓冲区大小
join_buffer_size = 2M # 连接缓冲区大小
thread_cache_size = 8 # 线程缓存大小
sync_binlog = 0 # 数据刷盘参数=0时,由文件系统控制写盘的频率,并发性能最好,但是意外丢失数据的风险最大
gtid_mode = ON # 开启GTID模式,用于自动处理复制中的事务
enforce_gtid_consistency = ON # GTID\_MODE 和 ENFORCE\_GTID\_CONSISTENCY 的设置是一致的,强制全局事务标识的一致性
# 日志设置
log-short-format = 1 # 使用短格式记录日志
slow_query_log # 启用慢查询日志
long_query_time = 2 # 慢查询的时间阈值
# 二进制日志设置
binlog_format = MIXED # 二进制日志格式
binlog_expire_logs_seconds = 864000 # 二进制日志过期时间(单位:秒)
# InnoDB特定选项
innodb_buffer_pool_size = 4G # InnoDB缓冲池大小
innodb_thread_concurrency = 8 # InnoDB线程并发数
innodb_flush_method = O\_DIRECT # InnoDB刷新日志的方法
innodb_flush_log_at_trx_commit = 1 # 控制事务日志的同步方式
innodb_log_buffer_size = 128M # InnoDB日志缓冲区大小
innodb_log_file_size = 256M # InnoDB日志文件大小
innodb_log_files_in_group = 3 # InnoDB日志文件组中的文件数
innodb_max_dirty_pages_pct = 90 # InnoDB脏页的最大比例
innodb_lock_wait_timeout = 50 # InnoDB锁等待超时时间(单位:秒)
innodb_file_per_table = 1 # 每个表使用独立的表空间文件
# plugin-load = semisync_slave.so # 半同步复制
# rpl_semi_sync_slave_enabled = 1 # 开启半同步复制
[mysqldump]
quick # 快速导出数据
max_allowed_packet = 16M # 最大允许的数据包大小
[myisamchk]
key_buffer_size = 256M # MyISAM键缓冲区大小
sort_buffer_size = 256M # MyISAM排序缓冲区大小
read_buffer = 2M # MyISAM读缓冲区大小
write_buffer = 2M # MyISAM写缓冲区大小
[mysqlhotcopy]
interactive-timeout = 3600 # 交互式超时时间,超时时间设置为 1 小时
授权启动
sudo chmod 644 /opt/software/mysqlcluster/slave1/conf/my.cnf
启动运行,命令如下:
docker-compose up -d
docker-compose ps
复制配置文件my.cnf到容器中
docker cp /opt/software/mysqlcluster/slave1/conf/my.cnf mysql_node1_slave1:/etc/mysql/my.cnf
重启容器
docker restart mysql_node1_slave1
进入主节点容器,命令如下:
docker exec -it mysql_node1_slave1 bash
登录mysql,命令如下:
mysql -u root -pnode1slave1root
参考server_id是否配置正确,判断my.cnf是否生效
SHOW VARIABLES LIKE 'server_id';
安装smeisync_slave模块,命令如下:
install plugin rpl_semi_sync_slave soname 'semisync\_slave.so';
set global rpl_semi_sync_slave_enabled = on;
查看效果,命令如下:
show global variables like 'rpl\_semi%';
输出结果:
mysql> show global variables like 'rpl_semi%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
2 rows in set (0.01 sec)
rpl_semi_sync_slave_enabled为ON表示设置成功。
授权,命令如下:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'node1slave1root';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'node1slave1root';
FLUSH PRIVILEGES;
退出容器将my.cnf文件中的:
# plugin-load = semisync\_slave.so # 半同步复制
# rpl\_semi\_sync\_slave\_enabled = 1 # 开启半同步复制
打开:
plugin-load = semisync_slave.so # 半同步复制
rpl_semi_sync_slave_enabled = 1 # 开启半同步复制
重启从节点1的mysql服务,命令如下:
docker cp /opt/software/mysqlcluster/slave1/conf/my.cnf mysql_node1_slave1:/etc/mysql/my.cnf
docker restart mysql_node1_slave1
docker exec -it mysql_node1_slave1 bash
mysql -u root -pnode1slave1root
部署node1节点的slave2
docker-compose.yaml文件
编辑docker-compose.yaml文件,代码如下:
mkdir -p /var/lib/mysqlslave2
ls -ld /var/lib/mysqlslave2/
chmod 755 /var/lib/mysqlslave2/
ls -ld /var/lib/mysqlslave2/
mkdir /opt/software/mysqlcluster/slave2
cd /opt/software/mysqlcluster/slave2
vi docker-compose.yaml
文件内容,代码如下:
version: '3' # 使用docker-compose版本3
services: # 定义服务
mysql_master: # 定义一个名为mysql\_master的服务
image: mysql:8.0.20 # 使用MySQL 8.0.20镜像
container_name: mysql_node1_slave2 # 指定容器名称为mysql\_node1\_slave2
restart: unless-stopped # 在容器退出时自动重新启动
ports: # 定义容器和主机之间的端口映射
- "33065:3310" # 将容器的3306端口映射到主机的33061端口
environment: # 定义环境变量
MYSQL_ROOT_PASSWORD: node2slave2root # 设置root用户的密码
volumes: # 定义数据卷
- /var/lib/mysqlslave2:/var/lib/mysql # 数据目录
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "-u", "root", "-pnode2slave2root"] # 设置容器健康检查命令
interval: 20s # 每隔20秒进行一次健康检查
timeout: 10s # 健康检查超时时间为10秒
retries: 3 # 健康检查失败时重试次数为3次
授权文件
sudo chmod 777 docker-compose.yaml
mkdir -p /opt/software/mysqlcluster/slave2/conf
vi /opt/software/mysqlcluster/slave2/conf/my.cnf
my.cnf文件
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
symbolic-links=0
default-storage-engine = InnoDB # 默认存储引擎
server_id = 1021 # 服务器的唯一标识符
bind-address = 0.0.0.0 # 服务器监听的IP地址
port = 3310 # 服务器监听的端口号
character-set-server = utf8mb4 # 服务器使用的字符集
skip-external-locking # 不使用外部锁定
skip-name-resolve # 不进行域名解析
relay_log = relay-log # 开启中继日志
relay_log_index = slave-relay-bin.index # 设置中继日志索引的文件名
read_only = ON # 启用只读属性
relay_log_purge = 0 # 是否自动清空不再需要中继日志
log_slave_updates=1 # 开启从服务器记录二进制日志更新的功能
max_connections = 2000 # 最大连接数
max_user_connections = 1000 # 单个用户最大连接数
max_connect_errors = 4000 # 最大连接错误数
wait_timeout = 300 # 空闲连接的超时时间
interactive_timeout = 600 # 交互式连接的超时时间
table_open_cache = 512 # 表缓存大小
max_allowed_packet = 32M # 最大允许的数据包大小
sort_buffer_size = 2M # 排序缓冲区大小
join_buffer_size = 2M # 连接缓冲区大小
thread_cache_size = 8 # 线程缓存大小
sync_binlog = 0 # 数据刷盘参数=0时,由文件系统控制写盘的频率,并发性能最好,但是意外丢失数据的风险最大
gtid_mode = ON # 开启GTID模式,用于自动处理复制中的事务
enforce_gtid_consistency = ON # GTID\_MODE 和 ENFORCE\_GTID\_CONSISTENCY 的设置是一致的,强制全局事务标识的一致性
# 日志设置
log-short-format = 1 # 使用短格式记录日志
slow_query_log # 启用慢查询日志
long_query_time = 2 # 慢查询的时间阈值
# 二进制日志设置
binlog_format = MIXED # 二进制日志格式
binlog_expire_logs_seconds = 864000 # 二进制日志过期时间(单位:秒)
# InnoDB特定选项
innodb_buffer_pool_size = 4G # InnoDB缓冲池大小
innodb_thread_concurrency = 8 # InnoDB线程并发数
innodb_flush_method = O\_DIRECT # InnoDB刷新日志的方法
innodb_flush_log_at_trx_commit = 1 # 控制事务日志的同步方式
innodb_log_buffer_size = 128M # InnoDB日志缓冲区大小
innodb_log_file_size = 256M # InnoDB日志文件大小
innodb_log_files_in_group = 3 # InnoDB日志文件组中的文件数
innodb_max_dirty_pages_pct = 90 # InnoDB脏页的最大比例
innodb_lock_wait_timeout = 50 # InnoDB锁等待超时时间(单位:秒)
innodb_file_per_table = 1 # 每个表使用独立的表空间文件
plugin-load = semisync_slave.so # 半同步复制
rpl_semi_sync_slave_enabled = 1 # 开启半同步复制
[mysqldump]
quick # 快速导出数据
max_allowed_packet = 16M # 最大允许的数据包大小
[myisamchk]
key_buffer_size = 256M # MyISAM键缓冲区大小
sort_buffer_size = 256M # MyISAM排序缓冲区大小
read_buffer = 2M # MyISAM读缓冲区大小
write_buffer = 2M # MyISAM写缓冲区大小
[mysqlhotcopy]
interactive-timeout = 3600 # 交互式超时时间,超时时间设置为 1 小时
授权启动
sudo chmod 644 /opt/software/mysqlcluster/slave2/conf/my.cnf
启动运行,命令如下:
docker-compose up -d
docker-compose ps
复制配置文件my.cnf到容器中
docker cp /opt/software/mysqlcluster/slave2/conf/my.cnf mysql_node1_slave2:/etc/mysql/my.cnf
重启容器
docker restart mysql_node1_slave2
进入主节点容器,命令如下:
docker exec -it mysql_node1_slave2 bash
登录mysql,命令如下:
mysql -u root -pnode2slave2root
参考server_id是否配置正确,判断my.cnf是否生效
SHOW VARIABLES LIKE 'server_id';
安装smeisync_slave模块,命令如下:
install plugin rpl_semi_sync_slave soname 'semisync\_slave.so';
set global rpl_semi_sync_slave_enabled = on;
查看效果,命令如下:
show global variables like 'rpl\_semi%';
输出结果:
mysql> show global variables like 'rpl_semi%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
2 rows in set (0.01 sec)
rpl_semi_sync_slave_enabled为ON表示设置成功。
授权,命令如下:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'node2slave2root';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'node2slave2root';
FLUSH PRIVILEGES;
退出容器将my.cnf文件中的:
# plugin-load = semisync\_slave.so # 半同步复制
# rpl\_semi\_sync\_slave\_enabled = 1 # 开启半同步复制
打开:
plugin-load = semisync_slave.so # 半同步复制
rpl_semi_sync_slave_enabled = 1 # 开启半同步复制
重启从节点2的mysql服务,命令如下:
docker cp /opt/software/mysqlcluster/slave2/conf/my.cnf mysql_node1_slave2:/etc/mysql/my.cnf
docker restart mysql_node1_slave2
docker exec -it mysql_node1_slave2 bash
mysql -u root -pnode2slave2root
查看master节点状态
show master status;
配置三个从节点的主从同步配置
配置规划
node1 | node2 | node3 |
---|---|---|
master1 | master2 | master3 |
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
最后的话
最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!
资料预览
给大家整理的视频资料:
给大家整理的电子书资料:
如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
从同步配置
配置规划
node1 | node2 | node3 |
---|---|---|
master1 | master2 | master3 |
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-2Vgyqzxi-1712657174707)]
[外链图片转存中…(img-urnJKtkc-1712657174708)]
[外链图片转存中…(img-ydP7s28Y-1712657174708)]
[外链图片转存中…(img-vMFft2iM-1712657174709)]
[外链图片转存中…(img-8vaYFxdX-1712657174709)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
[外链图片转存中…(img-HE0lsMhk-1712657174709)]
最后的话
最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!
资料预览
给大家整理的视频资料:
[外链图片转存中…(img-M97R8lJF-1712657174710)]
给大家整理的电子书资料:
[外链图片转存中…(img-ANZkpLUK-1712657174710)]
如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-rZPQQQKk-1712657174710)]