本文共 6891 字,大约阅读时间需要 22 分钟。
MySQL 多实例:简单理解就是在一台服务器上,MySQL 通过开启多个不同的端口(3306、3307、3308)来运行多个服务进程。这些 MySQL 服务进程通过不同的 socket 来监听不同的实例端口,进而实现互不干扰的提供各自的服务。
在同一台服务器上的 MySQL 多实例是共用一套 MySQL 应用程序,因此我们在部署 MySQL 的时候只需要部署一次 MySQL 程序即可,只是 MySQL 多实例之间会使用各自不同的 my.cnf 配置文件、启动程序和数据文件。在提供服务方面,MySQL 多实例在逻辑上看起来各自是独立的、互不干涉的,并且多个实例之间是根据配置文件的设定值来获取相关服务器的硬件资源。
当然像云数据库(RDS)都是每个实例单独部署一个 MySQL 程序,以便做的各种操作都不会互相影响;
(1)更充分利用服务器资源
当物理机配置比较高,单个实例无法充分使用服务器资源时,导致服务器资源过剩时,可以充分利用剩余的资源来提供更多的服务,或者是不同的业务错高峰运行;(2)节约服务器资源当公司预算不足,但是我们又需要使用主从同步技术,这时多实例是最好的选择;(3)提高 MySQL 服务性能MySQL 数据库随着连接数的上升,性能会出现下降。所以我们可以使用 MySQL 多实例来分担 MySQL 数据库的连接数;(1)多实例资源互相抢占的问题
当某个服务实例并发很高或者有慢查询时,整个实例会消耗更多的硬件资源,例如内存、CPU 和 IO 资源。这样必将导致服务器上的其他实例服务质量的下降,会对服务造成一定的影响。mysql 多实例一般来讲,有两种方案可以实现,两种方案各有利弊
可以通过使用过个配置文件来启动不同的 MySQL 进程,以此来实现多实例的创建;
优点: 配置简单,逻辑也比较简单
缺点: 如果实例太多,管理起来可能不是太方便通过官方自带的 mysqld_multi 工具来创建多实例,使用单独配置文件来实现多实例的管理
优点: 便于集中管理
缺点: 不方便针对每个实例的配置进行定制port | socket | conf |
---|---|---|
3307 | /tmp/mysql3307.sock | /data/mysql/mysql3307/my3307.cnf |
3308 | /tmp/mysql3308.sock | /data/mysql/mysql3307/my3308.cnf |
# yum install libaio -y
国内源:
# wget -P /opt/ http://mirrors.ustc.edu.cn/mysql-ftp/Downloads/MySQL-5.7/mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz
国外源:
# wget -P /opt/ https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz
# useradd -s /sbin/nologin -M mysql
# mkdir /opt/mysql/# tar zxf /opt/mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz -C /opt/mysql/# cd /usr/local/# ln -s /opt/mysql/mysql-5.7.18-linux-glibc2.5-x86_64 mysql
# mkdir -pv /data/mysql/mysql3307/{data,logs,tmp}
# chown -R mysql.mysql /usr/local/mysql# chown -R mysql.mysql /data
我们使用的配置文件为:/data/mysql/mysql3307/my3307.cnf
# cat > /data/mysql/mysql3307/my3307.cnf << EOF###### base #######my.cnf[client]port = 3307socket = /tmp/mysql3307.sock[mysql]prompt="\u@\h:\p [\d]> " no-auto-rehash[mysqld]#miscuser = mysqlbasedir = /usr/local/mysqldatadir = /data/mysql/mysql3307/datatmpdir = /data/mysql/mysql3307/tmpport = 3307socket = /tmp/mysql3307.sockevent_scheduler = 0#timeoutinteractive_timeout = 300wait_timeout = 300#character setcharacter-set-server = utf8open_files_limit = 65535max_connections = 100max_connect_errors = 100000lower_case_table_names =1###### GTID ######gtid-mode = onenforce-gtid-consistency=1###### symi replication #######rpl_semi_sync_master_enabled=1#rpl_semi_sync_master_timeout=1000 # 1 second#rpl_semi_sync_slave_enabled=1####### slow log ######log-output=fileslow_query_log = 1slow_query_log_file = slow.loglog-error = error.loglog_warnings = 2pid-file = mysql.pidlong_query_time = 1#log-slow-admin-statements = 1#log-queries-not-using-indexes = 1log-slow-slave-statements = 1####### binlog ######binlog_format = rowserver-id = 1003307log-bin = /data/mysql/mysql3307/logs/mysql-binmax_binlog_size = 256Msync_binlog = 0expire_logs_days = 10#procedure log_bin_trust_function_creators=1####### relay log ######skip_slave_start = 1max_relay_log_size = 128Mrelay_log_purge = 1relay_log_recovery = 1relay-log=relay-binrelay-log-index = relay-bin.indexlog_slave_updates = ON#slave-skip-errors=1032,1053,1062#skip-grant-tables####### buffers & cache ######table_open_cache = 2048table_definition_cache = 2048table_open_cache = 2048max_heap_table_size = 96Msort_buffer_size = 128Kjoin_buffer_size = 128Kthread_cache_size = 200query_cache_size = 0query_cache_type = 0query_cache_limit = 256Kquery_cache_min_res_unit = 512thread_stack = 192Ktmp_table_size = 96Mkey_buffer_size = 8Mread_buffer_size = 2Mread_rnd_buffer_size = 16Mbulk_insert_buffer_size = 32M#myisammyisam_sort_buffer_size = 128Mmyisam_max_sort_file_size = 10Gmyisam_repair_threads = 1#innodbinnodb_buffer_pool_size = 100Minnodb_buffer_pool_instances = 1innodb_data_file_path = ibdata1:100M:autoextendinnodb_flush_log_at_trx_commit = 2innodb_log_buffer_size = 8Minnodb_log_file_size = 100Minnodb_log_files_in_group = 3innodb_max_dirty_pages_pct = 50innodb_file_per_table = 1innodb_rollback_on_timeoutinnodb_io_capacity = 2000transaction_isolation = READ-COMMITTEDinnodb_flush_method = O_DIRECTEOF
# cd /usr/local/mysql# ./bin/mysqld --defaults-file=/data/mysql/mysql3307/my3307.cnf --initialize
# /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3307/my3307.cnf &
注意:第一次登录需要用初始密码登录;
# mysql -uroot -p -S /tmp/mysql3307.sock
查看初始密码:
# grep "password" /data/mysql/mysql3307/data/error.log 2018-01-09T07:51:15.311189Z 1 [Note] A temporary password is generated for root@localhost: /+dYyouJn2/g
初始密码为: /+dYyouJn2/g 每次初始化密码都不会相同;
登录数据库修改密码为:unixfbi.com# mysql -uroot -p 初始密码 -S /tmp/mysql3307.sock mysql> alter user user() identified by 'unixfbi.com';
或者:
mysql> SET PASSWORD=PASSWORD('unixfbi.com');mysql> flush privileges;
# mkdir -pv /data/mysql/mysql3308/{data,logs,tmp}
我们使用的配置文件为:/data/mysql/mysql3308/my3308.cnf
cp /data/mysql/mysql3307/my3307.cnf /data/mysql/mysql3308/my3308.cnfsed -i 's/3307/3308/g' /data/mysql/mysql3308/my3308.cnf
我们这里复制一下 3307 实例的配置文件,然后修改一下。其实需要修改的内容为:
# grep "3307" /data/mysql/mysql3308/my3308.cnf port = 3307socket = /tmp/mysql3307.sockdatadir = /data/mysql/mysql3307/datatmpdir = /data/mysql/mysql3307/tmpport = 3307socket = /tmp/mysql3307.sockserver-id = 1003307log-bin = /data/mysql/mysql3307/logs/mysql-bin
# chown -R mysql.mysql /data/mysql/mysql3308/
# ./bin/mysqld --defaults-file=/data/mysql/mysql3308/my3308.cnf --initialize
# /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3308/my3308.cnf &
注意:第一次登录需要用初始密码登录;
# mysql -uroot -p -S /tmp/mysql3308.sock
查看初始密码:
# grep "password" /data/mysql/mysql3308/data/error.log 2018-01-09T09:00:33.711566Z 1 [Note] A temporary password is generated for root@localhost: 0L8fUEe,j,;w
初始密码为: 0L8fUEe,j,;w 每次初始化密码都不会相同;
登录数据库修改密码为:unixfbi.com# mysql -uroot -p 初始密码 -S /tmp/mysql3308.sock mysql> alter user user() identified by 'unixfbi.com';
或者:
mysql> SET PASSWORD=PASSWORD('unixfbi.com');mysql> flush privileges;
# cat > /etc/my.cnf << EOF[mysql]prompt="\u@\h:\p [\d]> " EOF
登录后的效果:
root@localhost:mysql3308.sock [(none)]>
启动
/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3308/my3308.cnf &
停止
mysqladmin -S /tmp/mysql3308.sock -p shutdown
登录
mysql -S /tmp/mysql3308.sock -uroot -p
# /usr/local/mysql/bin/mysqld_safe --defaults-file=/path/my.cnf &
这种方式还需要修改 mysqld_safe 脚本
/usr/local/mysql/bin/mysqld --defaults-file=/path/my.cnf &
这是最省事的一种启动方式
# /usr/local/mysql/bin/mysqld_multi start 3307
这种方式必须是以 mysqld_multi 方式创建的多实例才可以使用该方式启动或者停止;
参考文档转:转载于:https://blog.51cto.com/moerjinrong/2133061