生产环境mysql安装规划及调优实践(二)--mysql8.0.29为例

上一篇讲了如何安装mysql,这一篇讲一下主从复制的设置,以及生产常用的参数设置。

因为mysql的生产使用场景不同,所以不同的使用场景下,参数配置也要针对不同的业务来进行设置。比如是倾向于快速更新,还是倾向于大查询,或者是倾向于高并发。又或者是并发不高,更倾向于单连接的执行速度。

还有缓冲命中等问题,比如查询的重复度高不高之类。

废话不多说,先上主从服务器的生产配置。

主从服务器生产环境配置

主服务器10.10.10.1

[mysqld]
#基础参数
user = bdusr
port = 3306
character-set-server = UTF8MB4
default-storage-engine = INNODB
datadir = /data/mysql/data
socket = /data/database/mysql.sock
log-error = /data/database/log/mysqld.log
pid-file = /data/database/mysqld.pid
##禁用DNS查找
skip_name_resolve
##telnet或者nc到mysql的监听端口的时候,mysql总是会直接打印版本和mysql信息,这样设置一下就没了
##注意要在 /data/database/ 路径下创建一个空文件 mysql_server_messages 
lc_messages_dir = /data/database/

##确保sysdate()返回与now一致
sysdate-is-now = 1

#特定参数
symbolic-links = 0
##这个部分根据业务,自行制定,通常不要随便变动生产环境的,否则可能导致本来可以正常运行的历史应用无法使用。
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
innodb_flush_log_at_trx_commit = 0
lower_case_table_names = 1
##控制mysql可以接受的包的最大的大小,这个主从服务器要一致
max_allowed_packet = 128M
max_heap_table_size = 128M
tmp_table_size = 16M




#文件句柄、连接限制、超时参数
open_files_limit = 100000
table_open_cache = 8000
max_length_for_sort_data = 8096




max_connections = 500
max_connect_errors = 1000000


wait_timeout = 36000
interactive_timeout = 36000


#内存性能调优参数
###innodb_buffer_pool_size通常设置为服务器可用内存的70%[(总内存-每个线程需要的内存*连接数)-系统保留内存]
innodb_buffer_pool_size = 100G
innodb_buffer_pool_instances = 50
innodb_buffer_pool_chunk_size = 1G

####内存临时表大小,如果超出这个大小,则会生成磁盘临时表
tmp_table_size=256m
max_heap_table_size=256m


###针对每个链接线程使用的内存,注意是每个链接,只要有相应的查询需要,链接就会被分配对应的内存。所以要结合连接数来设置,防止内存溢出。
####每个线程分配的链接缓冲区大小,如果一个连接中关联了多个表,那么就会针对每个表分配如下尺寸的缓冲区,不易太大。
join_buffer_size = 8M
####链接只要涉及查询,就会分配该尺寸的内存缓冲
sort_buffer_size = 16M
####这个参数必须是4K的整数倍,连接涉及到全表扫描时,就会一次性全额分配
read_buffer_size = 8M
####索引缓冲区的大小,连接涉及到操作时,mysql会根据需要分配指定的内存
read_rnd_buffer_size = 16M




innodb_sort_buffer_size = 64M
myisam_sort_buffer_size = 64M

#I/O调优参数
#单个日志文件大小
innodb_log_file_size=128M
#日志缓存大小,通常1秒左右就会刷新日志缓冲进入文件,所以不需太大,能存储1秒的事务就可以。
innodb_log_buffer_size=32M
#日志刷新的频率
innodb_flush_log_at_trx_commit=2


###linux下flush_method设置为O_DIRECT,相当于通知操作系统关闭操作系统缓冲,所有读写都通过存储设备来完成。
innodb_flush_method = O_DIRECT
###控制innodb双写缓冲,增加数据安全性
innodb_doublewrite = 1
###为每一个innodb表建立单独的表空间,而不是都塞在系统表空间下
innodb_file_per_table = 1




#主从同步、bin-log配置
##关键配置
log-bin = /data/database/binlog/mysql-bin.log
###服务器id,master和slaver的不能一样
server-id = 1


##可选配置
binlog_cache_size = 20M
###忽略主从同步的库(mysql库放里面,意味着用户等主从得手动两边建)
binlog-ignore-db = mysql
### binlog的格式,5.7版本之后建议row,另外一种是mixed混合式
binlog_format = row
###与binlog_format参数配合使用,减少日志量,默认是full,会导致binlog比较大,给主从复制带来不必要的开销
binlog_row_image = minimal
###binlog同步到磁盘的频率
sync_binlog = 100


###mysql8.0已作废参数,用下面的参数替代
####expire_logs_days
####slave-skip-errors
####log-slave-updates


###配置二进制日志自动删除/过期时间,单位秒,默认值为2592000,即30天;8.0.3版本之前使用expire_logs_days,单位天数,默认值为0,表示不自动删除。
binlog_expire_logs_seconds = 2592000
###跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断,默认OFF关闭,可选值有OFF、all、ddl_exist_errors以及错误码列表。8.0.26版本之前使用slave_skip_errors。如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
replica_skip_errors = all
### log_replica_updates 替代log-slave-updates参数,本场景中。不存在从库作为其它库的主库的情况。on 时从库写binlog时,主从同步的从I/O线程读取主库binlog也写入从库的binlog,默认不开启。








#不使用X plugin协议,不用监听33060端口!需要使用的自己改
mysqlx = 0
mysqlx_interactive_timeout = 36000
mysqlx_wait_timeout = 36000


[client]
port = 3306
socket = /data/database/mysql.sock

从服务器10.10.10.2

[mysqld]
#基础参数
user = bdusr
port = 3306
character-set-server = UTF8MB4
default-storage-engine = INNODB
datadir = /data/database/data
socket = /data/database/mysql.sock
log-error = /data/database/log/mysqld.log
pid-file = /data/database/mysqld.pid
##禁用DNS查找
skip_name_resolve
##确保sysdate()返回与now一致
sysdate-is-now = 1

#特定参数,主备需一致
symbolic-links = 0
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
innodb_flush_log_at_trx_commit = 0
lower_case_table_names = 1
##控制mysql可以接受的包的最大的大小,主备需一致
max_allowed_packet = 128M
max_heap_table_size = 128M
tmp_table_size = 16M




#文件句柄、连接限制、超时参数
open_files_limit = 100000
table_open_cache = 8000
max_length_for_sort_data = 8096




max_connections = 500
max_connect_errors = 1000000


wait_timeout = 36000
interactive_timeout = 36000


#内存性能调优参数
###innodb_buffer_pool_size通常设置为服务器可用内存的70%。[(总内存-每个线程需要的内存*连接数)-系统保留内存]
innodb_buffer_pool_size = 100G
innodb_buffer_pool_instances = 50
innodb_buffer_pool_chunk_size = 1G

####内存临时表大小,如果超出这个大小,则会生成磁盘临时表
tmp_table_size=256m
max_heap_table_size=256m

###针对每个链接线程使用的内存,注意是每个链接,只要有相应的查询需要,链接就会被分配对应的内存。所以要结合连接数来设置,防止内存溢出。
####每个线程分配的链接缓冲区大小,如果一个连接中关联了多个表,那么就会针对每个表分配如下尺寸的缓冲区,不易太大。
join_buffer_size = 8M
####链接只要涉及查询,就会分配该尺寸的内存缓冲
sort_buffer_size = 16M
####这个参数必须是4K的整数倍,连接涉及到全表扫描时,就会一次性全额分配
read_buffer_size = 8M
####索引缓冲区的大小,连接涉及到操作时,mysql会根据需要分配指定的内存
read_rnd_buffer_size = 16M


innodb_sort_buffer_size = 64M
myisam_sort_buffer_size = 64M



#I/O调优参数
#单个日志文件大小
innodb_log_file_size=128M
#日志缓存大小,通常1秒左右就会刷新日志缓冲进入文件,所以不需太大,能存储1秒的事务就可以。
innodb_log_buffer_size=32M
#日志刷新的频率
innodb_flush_log_at_trx_commit=2

###linux下flush_method设置为O_DIRECT,相当于通知操作系统关闭操作系统缓冲,所有读写都通过存储设备来完成。
innodb_flush_method = O_DIRECT
###控制innodb双写缓冲,增加数据安全性
innodb_doublewrite = 1
###为每一个innodb表建立单独的表空间,而不是都塞在系统表空间下
innodb_file_per_table = 1




#主从同步、bin-log配置
##关键配置(从服务器)
log-bin = /data/database/binlog/mysql-bin.log
###服务器id,master和slaver的不能一样
server-id = 2
# relay_log配置中继日志,默认采用 主机名-relay-bin 的方式保存日志文件,主机名修改会导致主从复制无法启动或启动失败。因此要指定
#relay_log = replicas-mysql-relay-bin  



##可选配置
###禁用slave自动恢复,从库如果宕机,重启后,主从同步需要人工来启动!
skip_slave_start
binlog_cache_size = 20M
###忽略主从同步的库(mysql库放里面,意味着用户等主从得手动两边建)
binlog-ignore-db = mysql
### binlog的格式,5.7版本之后建议row,另外一种是mixed混合式
binlog_format = row
###与binlog_format参数配合使用,减少日志量,默认是full,会导致binlog比较大,给主从复制带来不必要的开销
binlog_row_image=minimal
###binlog同步到磁盘的频率
sync_binlog = 100


###mysql8.0已作废参数,用下面的参数替代
####expire_logs_days
####slave-skip-errors
####log-slave-updates


###配置二进制日志自动删除/过期时间,单位秒,默认值为2592000,即30天;8.0.3版本之前使用expire_logs_days,单位天数,默认值为0,表示不自动删除。
binlog_expire_logs_seconds = 2592000
###跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断,默认OFF关闭,可选值有OFF、all、ddl_exist_errors以及错误码列表。8.0.26版本之前使用slave_skip_errors。如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致。这里设置成all,跳过所有错误是有可能导致主从不一致的,需要注意。只能针对不是特别严谨要求的主从复制的情况。定期需人工巡检主从记录数是否一致,这个有很多工具都能实现。
replica_skip_errors = all
### log_replica_updates 替代log-slave-updates参数,本场景中。不存在从库作为其它库的主库的情况。on 时从库写binlog时,主从同步的从I/O线程读取主库binlog也写入从库的binlog,默认不开启。

# log_replica_updates表示slave是否将复制事件写进自己的二进制日志,默认值ON开启;8.0.26版本之前使用log_slave_updates。如果从服务器后面还有复制服务器,那么这个选项必须ON
log_replica_updates = ON
# read_only阻止任何没有super权限的用户对库进行写操作,可以防止从库被写。视自己的业务场景情况而定。
# read_only = ON




#不使用X plugin协议,不用监听33060端口!视自己是否需要使用该新特性来开启。
mysqlx = 0
mysqlx_interactive_timeout = 36000
mysqlx_wait_timeout = 36000


[client]
port =3306
socket = /data/database/mysql.sock

主库中创建主从同步用户

网上大多数的例子都是创建repl用户,来作为主从同步的用户。生产配置,考虑到黑暗森林法则,越是通用的网上的东西,越要少用,尤其是用户名。所以呢,这里也只是个示例名称,生产的用户名是一般不会外泄的。黑暗森林法则,玩的就是我知道,而你不知道!!!这里以masttos为例 

mysql> CREATE USER 'masttos'@'%' IDENTIFIED WITH mysql_native_password BY '1qaz@WSX';

mysql> GRANT REPLICATION SLAVE ON *.* TO 'masttos'@'%';

mysql> FLUSH PRIVILEGES;

注意这里,WITH mysql_native_password 指定了密码插件,依然使用老的。如果不指定,会使用8.0的新的密码插件。

2023年4月9日,新增配置信息,修订该文章。主要是安全方面,mysql的端口被telnet或者nc之类的软件连接,就可以明显的看到mysql和版本信息,是mysql服务端主动发给端口连接者的,就是这个原因,会导致mysql容易被攻击,很多端口扫描工具会识别这个信息。那么我们就来个黑暗森林法则,让客户端连接到端口的时候,不回应mysql和mysql的版本信息,让攻击的难度加大。

注:如果是人工连接,还是可以看出来是mysql的端口,因为认证失败的回应中,还是有mysql的字样。但是大多数攻击的人都用的是制作好的端口扫描工具,通常回应的信息发声了改变,就会导致端口识别服务识别不正确,从而达到黑暗森林的目的。如果人家本来就知道你得端口是数据库端口,还是乖乖的把相关的安全漏洞补丁都及时打上吧。

#telnet或者nc到mysql的监听端口的时候,mysql总是会直接打印版本和mysql信息,这样设置一下就没了
#注意要在 /data/database/ 路径下创建一个空文件 mysql_server_messages 
lc_messages_dir = /data/database/

主库备份并导入备库

对于新的主从配置,要先在主库执行备份。如下所示。

在执行之前最好先在主库,看一下master的状态。记录下binlog文件名和Position

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      157 |              | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

然后在主库执行如下备份语句,备份语句不会锁库,所以建议先备份不活跃的库。最后备份业务频繁的库。由于备份之前,先看了MASTER的信息,后期同步的时候,备份期间库内发生的变动,会在从库执行!这一点注意!!对于部分update语句,可能导致主从数值不一致的情况。如果要求特别严格的一致,那么最好是要把主库锁了进行备份。database_name就是要备份的库名。一个库,一个库的备份。对于恢复的时候,操作比较方便。如果有问题,也只影响一个库。

mysqldump -uroot -p  database_name  --hex-blob  --default-character-set=utf8 --max_allowed_packet=512M --complete-insert --insert-ignore  --skip-opt  --create-options --single-transaction  -q -e --no-autocommit  -R  --events  --result-file=./database_name.sql

把备份文件复制到从库所在主机,然后执行下面的命令,恢复从库。

mysql -uroot -p database_name< ./database_name.sql

启动主从同步

在从库,执行以下语句,更新主从同步信息

mysql> CHANGE REPLICATION SOURCE TO SOURCE_HOST='10.10.10.1',SOURCE_PORT=3306,SOURCE_USER='masttos',SOURCE_PASSWORD='1qaz@WSX',SOURCE_LOG_FILE='mysql-bin.000002',SOURCE_LOG_POS=157;

这里需要注意:

如果报错
[ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master '[email protected]:3306' - retry-time: 60 retries: 10 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061
一般是因为主从同步用户的密码插件导致的。解决办法两种:
1、到主库去修改主从同步的用户的密码插件:
ALTER USER 'masttos'@'%' IDENTIFIED WITH mysql_native_password BY '1qaz@WSX';
2、在配置主从同步的时候增加 GET_MASTER_PUBLIC_KEY = {0|1} 的选项。
此选项适用于使用GET_MASTER_PUBLIC_KEY身份验证插件进行身份验证的副本。对于使用此插件进行身份验证的帐户连接,除非请求,否则源不会发送公钥,因此必须在客户端请求或指定公钥。如果给出了MASTER_PUBLIC_KEY_PATH并指定了有效的公钥文件,则它优先于GET_MASTER_PUBLIC_KEY。如果您使用的复制用户帐户使用caching_sha2_password插件(MySQL 8.0中的默认插件)进行身份验证,并且您没有使用安全连接,则必须指定此选项或MASTER_PUBLIC_KEY_PATH选项,以向复制副本提供RSA公钥。
如果复制用户的身份验证插件是:caching_sha2_password,则需要指定GET_MASTER_PUBLIC_KEY=1;
 CHANGE REPLICATION SOURCE TO SOURCE_HOST='10.10.10.1',SOURCE_PORT=3306,SOURCE_USER='masttos',SOURCE_PASSWORD='1qaz@WSX',SOURCE_LOG_FILE='mysql-bin.000002',SOURCE_LOG_POS=157,GET_MASTER_PUBLIC_KEY=1;
这里要注意:SOURCE_LOG_FILE和SOURCE_LOG_POS,最好从库里查出来。不然对于已经在主从同步的库来说,可能造成主从同步不一致。

从节点:启动主从同步:

mysql> START REPLICA;

mysql> SHOW REPLICA STATUS\G;
*************************** 1. row ***************************
             Replica_IO_State: Waiting for source to send event
                  Source_Host: 10.10.10.1
                  Source_User: masttos
                  Source_Port: 3306
                Connect_Retry: 60
              Source_Log_File: mysql-bin.000002
          Read_Source_Log_Pos: 4848500
               Relay_Log_File: replicas-mysql-relay-bin.000002
                Relay_Log_Pos: 4848669
        Relay_Source_Log_File: mysql-bin.000002
           Replica_IO_Running: Yes
          Replica_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_Source_Log_Pos: 4848500
              Relay_Log_Space: 4848888
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Source_SSL_Allowed: No
           Source_SSL_CA_File:
           Source_SSL_CA_Path:
              Source_SSL_Cert:
            Source_SSL_Cipher:
               Source_SSL_Key:
        Seconds_Behind_Source: 0
Source_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Source_Server_Id: 1
                  Source_UUID: 4645727d-bd18-11ea-a999-e8611f255e14
             Source_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
    Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Source_Retry_Count: 86400
                  Source_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Source_SSL_Crl:
           Source_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Source_TLS_Version:
       Source_public_key_path:
        Get_Source_public_key: 0
            Network_Namespace:
1 row in set (0.00 sec)

Mysql生产级别配置,以及主从同步配置至此全部完成。

养成一个良好的习惯,配置文件里加好备注,不同功能的参数放在不同的区域。这样优化时不乱,调参时有的放矢,也不乱!

猜你喜欢

转载自blog.csdn.net/supperman_009/article/details/125645080