我主要使用Portainer作为个人docker的管理工具,下面一些步骤大部分是在Portainer界面下的操作。
文件准备
分别创建主从数据库的数据存放目录和配置文件
主数据库
mkdir -p ./mysqlms/master/data
mkdir -p ./mysqlms/master/conf.d
配置文件
vi ./mysqlms/master/conf.d/my.cnf
my.cnf主要内容如下
[mysqld]
default-time_zone = '+8:00'
collation-server=utf8mb4_unicode_ci
server-id=100
log-bin=master-bin
binlog-format=row
lower_case_table_names=1
从数据库
mkdir -p ./mysqlms/slave/data
mkdir -p ./mysqlms/slave/conf.d
配置文件
vi ./mysqlms/slave/conf.d/my.cnf
my.cnf主要内容如下
[mysqld]
server-id=101
read_only=1
default-time_zone = '+8:00'
collation-server=utf8mb4_unicode_ci
lower_case_table_names=1
从库的server-id不能和主库相同,主库要开启log-bin,从库设置为只读。
其他配置参考后面给出,如果做读写分类,主库可以侧重写性能,从库则侧重读优化。
创建容器
在portainer中创建stack,类似于创建一个docker-compose.yml,用compose部署这个服务。
如果是高版本的docker,并且开启了swarm,则会使用 docker stack deploy
部署
Editor中编辑的内容
version: "2"
services:
mysql57m:
image: mysql:5.7
ports:
- "4306:3306"
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--default-authentication-plugin=mysql_native_password
volumes:
- /home/zhujin/mysqlms/master/conf.d:/etc/mysql/conf.d
- /home/zhujin/mysqlms/master/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: admin123
mysql57s:
image: mysql:5.7
ports:
- "4307:3306"
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--default-authentication-plugin=mysql_native_password
volumes:
- /home/zhujin/mysqlms/slaver/conf.d:/etc/mysql/conf.d
- /home/zhujin/mysqlms/slaver/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: admin123
内容很简单,分别配置主从库的容器,映射3306端口,指定默认编码,挂载主机上的数据目录和配置文件目录,指定root密码
启动容器
数据库配置
直接portainer进入主数据库的控制台
类似docker exec -it mysqlms_mysql57m_1 bash
登录主数据库
mysql -uroot -padmin123
创建同步账号
mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
查看主库当前日志文件和位置
mysql> show master status;
记录下文件名master-bin.000003
和位置值14234
以同样方式登录从数据库
配置从库
mysql> change master to master_host='mysql57m',master_user='slave',master_password='123456',master_port=3306,master_log_file='master-bin.000003', master_log_pos=14234;
mysql> start slave;
master_host,由于主从服务器是编排在一个服务中的,master_host直接用的主库服务名,实际可以是主库的容器ip;或者是主机ip,此时master_port要取映射到主机上的端口。
因为主从数据库都是空库,没有手动复制数据的过程。从库配置过程中,主库不能接入客户端有任何操作,否则log-bin文件和偏移量可能会变。
docker inspect mysqlms_mysql57m_1 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.19.0.3",
在portainer中查找ip就更方便了。
查看从库同步状态
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: mysql57m
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000003
Read_Master_Log_Pos: 14234
Relay_Log_File: 4bb7c8dd7ea1-relay-bin.000002
Relay_Log_Pos: 321
Relay_Master_Log_File: master-bin.000003
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: 14234
Relay_Log_Space: 535
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: 6a476f6f-30b4-11eb-8271-0242ac130003
Master_Info_File: /var/lib/mysql/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:
1 row in set (0.00 sec)
验证复制
登录主库创建test数据库
CREATE DATABASE IF NOT EXISTS `test` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE `test`;
CREATE TABLE `user` (
`id` int(11) NOT NULL,
`name` varchar(200) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
登录从库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| phpmyadmin |
| sys |
| test |
+--------------------+
6 rows in set (0.00 sec)
mysql> use test;
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user |
+----------------+
1 row in set (0.00 sec)
mysql参考配置
max_connections | 151 | >= | 100 | 根据登录次数和使用spine 数据采集器, MariaDB 将需要许多连接. spine的计算是:total_connections = total_processes *(total_threads + script_servers + 1),那么您必须留下用于用户连接的空间,这取决于并发登录的帐户数. |
max_allowed_packet | 16777216 | >= | 16777216 | 通过远程poller 功能,大量数据将从主服务器同步到远程poller. 因此,请将此值保持在16M 或以上. |
max_heap_table_size | 125M | >= | 124M | 程序缓冲区。这有两种方法,首先将输出列的大小减小到合适的大小。此列位于表poller_output和poller_output_boost中。您可以做的第二件事是为内存表分配更多内存。我们已经任意选择了系统内存的10%的建议值,但是如果您使用的是SSD磁盘驱动器,或者有一个更小的系统,您可以忽略此建议或选择其他存储引擎。您可以在Console->System Utilities->viewboost Status下看到性能提升程序表的预期消耗量。 |
tmp_table_size | 125M | >= | 124M | 执行具有较大临时表大小的子查询时,请将这些临时表保存在内存中. |
join_buffer_size | 256M | >= | 249M | 在执行连接时,如果它们低于此大小,它们将被保存在内存中,并且不会写入临时文件. |
innodb_file_per_table | ON | = | ON | 使用InnoDB 存储引擎时,保持表空间的独立性很重要. 对于 MariaDB 的长期用户,表管理会变得更简单.如果您尚未开启此功能, 可以通过在所有InnoDB 表上运行alter 语句来开启此功能. |
innodb_buffer_pool_size | 1952M | >= | 1945M | InnoDB将在系统内存中保存尽可能多的表和索引。因此,您应该使innodb_buffer_池足够大,以便在内存中保存尽可能多的表和索引。检查数据库数据文件目录的大小将有助于确定该值。我们建议您的系统内存占系统总内存的25%,但您的要求将根据您的系统大小而有所不同。 |
innodb_doublewrite | ON | = | ON | 除非运行在ZFS或FusionI/O上,否则此设置应保持启用状态,因为这两个实例都具有内部日志记录功能,以适应突然发生的系统崩溃。但是,如果您有非常好的电源,并且您的系统很少停机,并且您有备份,那么将此设置设置为关闭可以使您的数据库性能提高近50%。 |
innodb_lock_wait_timeout | 50 | >= | 50 | 恶意查询不应该让数据库脱机给其他人. 请在杀死您的系统之前杀死这些查询. |
innodb_flush_method | fsync | eq | O_DIRECT | Maximum I/O performance happens when you use the O_DIRECT method to flush pages. |
innodb_flush_log_at_timeout | 1 | >= | 3 | 从 MariaDB 10.3.7开始,您可以控制 MariaDB将交易刷新到磁盘的频率. 默认值是1秒,但是在高I/O系统中设置为大于1的值可以允许磁盘I/O更有序 |
innodb_read_io_threads | 4 | >= | 32 | 采用现代SSD类型的存储器,具有多个读取IO线程对于具有高IO特性的应用是有利的. |
innodb_write_io_threads | 4 | >= | 16 | 采用现代SSD类型的存储器,具有多个写入IO线程对于具有高IO特性的应用是有利的. |
innodb_buffer_pool_instances | 1 | >= | 16 | MariaDB会将innodb_buffer_pool分成内存区域以提高性能. 最大值是64.当您的innodb_buffer_pool小于1GB时,您应该使用池大小除以128MB. 继续使用这个等式,最大值为64. |
innodb_io_capacity | 200 | >= | 5000 | 如果您有SSD磁盘,请使用此建议。如果您有物理硬盘驱动器,请使用200*阵列中活动驱动器的数量。如果使用NVMe或PCIe闪存,则可以使用更大的数字,高达100000。 |
innodb_io_capacity_max | 2000 | >= | 10000 | 同样是固体硬盘建议配置 |