后端存储系统单机部署多实例的情况并不多见,基本上都以专有服务器(Dedicated Server)的方式来部署。所以单机多实例基本上在测试环境会相对比较常见。另外,个人觉得生产服务器还有一种场景或许可能会用到单机多实例。比如对于前置MySQL代理服务的架构中,为了将来迁移起来更加容易,而且单机单多实例相对于单机单实例,没有太多性能下降的情况下,还是值得一试的。毕竟以后性能调整,只要增加服务器,迁移数据,不需要重新建库建表,也没有数据重新部署的问题。
本文将记录CentOS7上部署MariaDB多实例的过程。
第一步、安装系统、更新系统、安装MariaDB最新版本(过程略)。
第二步、调整系统参数 fs.aio-max-nr
$ cat /etc/sysctl.conf
# Increase size of file handles and inode cache
fs.file-max = 2097152
fs.aio-max-nr = 2097152
不增加这个参数可能会导致在打开MariaDB的开关选项innodb_use_native_aio时发生一个警告。具体位置/etc/sysctl.conf,修改完成后执行sysctl -p让配置生效。
第三步、建立目录,并初始化每一个实例。
$ mkdir /opt/data{0,1} && chown mysql:mysql /opt/data{0,1}
$ mysql_install_db --datadir=/opt/data0 --user=mysql --force --defaults-file=/opt/init.ini
$ mysql_install_db --datadir=/opt/data1 --user=mysql --force --defaults-file=/opt/init.ini
# init.ini是一个不包含相关路径的一个简易配置,主要设定ibdata大小、ib_logfile数量和大小、undo文件的数量等等
第四步、修改配置文件my.cnf和my.cnf.d下每个实例的配置
$ cat /etc/my.cnf
[mysqld_multi]
mysqld = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
$ cat /etc/my.cnf.d/3306.cnf
[mysqld0]
basedir = /usr #
character_set_server = utf8mb4 #
collation_server = utf8mb4_unicode_ci #
datadir = /opt/data0 #
default_storage_engine = InnoDB #
default_time_zone = '+8:00' #
event_scheduler = 1 #
init_connect = 'set names utf8mb4;' #
lower_case_table_names = 1 #
memlock = 0 #
pid_file = /opt/data0/mysql.pid #
port = 3306 #
skip_external_locking = 1 #
socket = /opt/data0/mysql.sock #
tmpdir = /dev/shm #
user = mysql #
general_log = 0 #
general_log_file = /opt/data0/general_query.log #
log_output = FILE #
log_error = /opt/data0/mysqld.log #
log_warnings = 2 #
log_queries_not_using_indexes = 1 #
log_slow_admin_statements = 1 #
log_slow_verbosity = query_plan #
long_query_time = 1 #
min_examined_row_limit = 100 #
slow_query_log = 1 #
slow_query_log_file = /opt/data0/slow_query.log #
gtid_strict_mode = 1 #
transaction_isolation = READ-COMMITTED #
innodb_data_home_dir = /opt/data0 #
innodb_data_file_path = ibdata1:16G:autoextend #
innodb_autoextend_increment = 512 #
innodb_buffer_pool_size = 30G #
innodb_buffer_pool_instances = 32 #
innodb_file_format = barracuda #
innodb_file_format_max = barracuda #
innodb_compression_algorithm = lzma #
innodb_compression_level = 6 #
innodb_buffer_pool_populate = 1 #
innodb_log_group_home_dir = /opt/data0 #
innodb_file_per_table = 1 #
innodb_undo_directory = /opt/data0 #
innodb_undo_logs = 128 #
innodb_undo_tablespaces = 12 #
binlog_cache_size = 4M #
binlog_checksum = crc32 #
binlog_format = row #
expire_logs_days = 30 #
log_bin = /opt/data0/mysql-bin #
max_binlog_cache_size = 128M #
max_binlog_size = 1G #
sync_binlog = 1 #
max_relay_log_size = 1G #
relay_log = /opt/data0/relay-bin #
relay_log_index = /opt/data0/relay-bin.index #
relay_log_info_file = relay-log.info #
relay_log_purge = 1 #
relay_log_recovery = 1 #
sync_relay_log = 10000 #
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links = 0 #
3307.cnf和3306.cnf不同在于:所有相关文件的路径、监听的端口号以及节点的名称mysqld1。
第五步:systemd启动文件
$ cat /etc/systemd/system/mariadb\@.service
#
# /etc/systemd/system/[email protected]
#
[Unit]
Description=Multi-Instance MariaDB Service
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
Type=forking
# true is needed for the ExecStartPre
PermissionsStartOnly=true
ExecStartPre=/usr/bin/mkdir -p /opt/data%i
ExecStartPre=/usr/bin/chown mysql:mysql /opt/data%i -R
ExecStart=/usr/bin/mysqld_multi start %i
ExecStop=/usr/bin/mysqld_multi stop %i
LimitNOFILE=102400
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=true
至此,MariaDB单机多实例应该就配置完成了,使用systemctl start mariadb@{0,1}同时启动两个实例,或者systemctl start mariadb@0单独启动一个实例。
如遇启动问题,可以根据提示查看相关提示,或者检察/opt/data{0,1}/mysqld.log,看看系统日志,并逐步排查。
当遇到存储瓶颈,可以将3307端口对应MariaDB服务和数据迁移到新服务器即可,过程不牵涉数据的重新部署,迁移起来相对更加容易。
参考文献:
http://www.anntoin.com/Blog/Tutorials/MultipleDBInstances.html
https://forums.opensuse.org/showthread.php/504526-OS-13-1-MARIADB-Using-multiple-mysql-instance-without-a-supplementary-standalone-database
http://www.fromdual.ch/multi-instance-set-up-with-mysql-enterprise-server-5-7-on-rhel-7-with-systemd
http://unix.stackexchange.com/questions/256285/run-multiple-instances-of-mysql-centos7