一、MySQL 多实例介绍
1.MySQL 多实例介绍
MySQL 多实例:简单理解就是在一台服务器上,MySQL 通过开启多个不同的端口(3306、3307、3308)来运行多个服务进程。这些 MySQL 服务进程通过不同的 socket 来监听不同的实例端口,进而实现互不干扰的提供各自的服务。
在同一台服务器上的 MySQL 多实例是共用一套 MySQL 应用程序,因此我们在部署 MySQL 的时候只需要部署一次 MySQL 程序即可,只是 MySQL 多实例之间会使用各自不同的 my.cnf 配置文件、启动程序和数据文件。在提供服务方面,MySQL 多实例在逻辑上看起来各自是独立的、互不干涉的,并且多个实例之间是根据配置文件的设定值来获取相关服务器的硬件资源。
当然像云数据库(RDS)都是每个实例单独部署一个 MySQL 程序,以便做的各种操作都不会互相影响;
2.MySQL 多实例优缺点
优点
(1)更充分利用服务器资源 当物理机配置比较高,单个实例无法充分使用服务器资源时,导致服务器资源过剩时,可以充分利用剩余的资源来提供更多的服务,或者是不同的业务错高峰运行; (2)节约服务器资源 当公司预算不足,但是我们又需要使用主从同步技术,这时多实例是最好的选择; (3)提高 MySQL 服务性能 MySQL 数据库随着连接数的上升,性能会出现下降。所以我们可以使用 MySQL 多实例来分担 MySQL 数据库的连接数;
缺点
(1)多实例资源互相抢占的问题 当某个服务实例并发很高或者有慢查询时,整个实例会消耗更多的硬件资源,例如内存、CPU 和 IO 资源。这样必将导致服务器上的其他实例服务质量的下降,会对服务造成一定的影响。
3.MySQL 多实例实现方式
mysql 多实例一般来讲,有两种方案可以实现,两种方案各有利弊
(1) 基于多配置文件
可以通过使用过个配置文件来启动不同的 MySQL 进程,以此来实现多实例的创建;
优点: 配置简单,逻辑也比较简单 缺点: 如果实例太多,管理起来可能不是太方便
(2) 基于 mysqld_multi
通过官方自带的 mysqld_multi 工具来创建多实例,使用单独配置文件来实现多实例的管理
优点: 便于集中管理 缺点: 不方便针对每个实例的配置进行定制
二、MySQL 多实例的部署
1.环境介绍
port | socket | conf |
---|---|---|
3307 | /tmp/mysql3307.sock | /data/mysql/mysql3307/my3307.cnf |
3308 | /tmp/mysql3308.sock | /data/mysql/mysql3307/my3308.cnf |
2.MySQL 3307 实例部署
(1) 装相关依赖
# yum install libaio -y
(2) 下载 MySQL 二进制安装包
国内源:
# 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
(3) 创建用户
# useradd -s /sbin/nologin -M mysql
(4) 解压软连接 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
(5) 创建数据库相关目录
# mkdir -pv /data/mysql/mysql3307/{data,logs,tmp}
(6) 修改相关目录权限
# chown -R mysql.mysql /usr/local/mysql
# chown -R mysql.mysql /data
(7) 创建配置文件
我们使用的配置文件为:/data/mysql/mysql3307/my3307.cnf
# cat > /data/mysql/mysql3307/my3307.cnf << EOF
###### base ######
#my.cnf
[client]
port = 3307
socket = /tmp/mysql3307.sock
[mysql]
prompt="\u@\h:\p [\d]> "
no-auto-rehash
[mysqld]
#misc
user = mysql
basedir = /usr/local/mysql
datadir = /data/mysql/mysql3307/data
tmpdir = /data/mysql/mysql3307/tmp
port = 3307
socket = /tmp/mysql3307.sock
event_scheduler = 0
#timeout
interactive_timeout = 300
wait_timeout = 300
#character set
character-set-server = utf8
open_files_limit = 65535
max_connections = 100
max_connect_errors = 100000
lower_case_table_names =1
###### GTID ######
gtid-mode = on
enforce-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=file
slow_query_log = 1
slow_query_log_file = slow.log
log-error = error.log
log_warnings = 2
pid-file = mysql.pid
long_query_time = 1
#log-slow-admin-statements = 1
#log-queries-not-using-indexes = 1
log-slow-slave-statements = 1
####### binlog ######
binlog_format = row
server-id = 1003307
log-bin = /data/mysql/mysql3307/logs/mysql-bin
max_binlog_size = 256M
sync_binlog = 0
expire_logs_days = 10
#procedure
log_bin_trust_function_creators=1
####### relay log ######
skip_slave_start = 1
max_relay_log_size = 128M
relay_log_purge = 1
relay_log_recovery = 1
relay-log=relay-bin
relay-log-index = relay-bin.index
log_slave_updates = ON
#slave-skip-errors=1032,1053,1062
#skip-grant-tables
####### buffers & cache ######
table_open_cache = 2048
table_definition_cache = 2048
table_open_cache = 2048
max_heap_table_size = 96M
sort_buffer_size = 128K
join_buffer_size = 128K
thread_cache_size = 200
query_cache_size = 0
query_cache_type = 0
query_cache_limit = 256K
query_cache_min_res_unit = 512
thread_stack = 192K
tmp_table_size = 96M
key_buffer_size = 8M
read_buffer_size = 2M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 32M
#myisam
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
#innodb
innodb_buffer_pool_size = 100M
innodb_buffer_pool_instances = 1
innodb_data_file_path = ibdata1:100M:autoextend
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 8M
innodb_log_file_size = 100M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 50
innodb_file_per_table = 1
innodb_rollback_on_timeout
innodb_io_capacity = 2000
transaction_isolation = READ-COMMITTED
innodb_flush_method = O_DIRECT
EOF
(8) 初始化 3307 实例数据库
# cd /usr/local/mysql
# ./bin/mysqld --defaults-file=/data/mysql/mysql3307/my3307.cnf --initialize
(9) 启动实例 3307
# /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3307/my3307.cnf &
(10) 登录 3307 实例
注意:第一次登录需要用初始密码登录;
# mysql -uroot -p -S /tmp/mysql3307.sock
(11) 修改初始密码
查看初始密码:
# 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;
3.MySQL 3308 实例部署
(1) 创建数据库相关目录
# mkdir -pv /data/mysql/mysql3308/{data,logs,tmp}
(2) 创建配置文件
我们使用的配置文件为:/data/mysql/mysql3308/my3308.cnf
cp /data/mysql/mysql3307/my3307.cnf /data/mysql/mysql3308/my3308.cnf
sed -i 's/3307/3308/g' /data/mysql/mysql3308/my3308.cnf
我们这里复制一下 3307 实例的配置文件,然后修改一下。其实需要修改的内容为:
# grep "3307" /data/mysql/mysql3308/my3308.cnf
port = 3307
socket = /tmp/mysql3307.sock
datadir = /data/mysql/mysql3307/data
tmpdir = /data/mysql/mysql3307/tmp
port = 3307
socket = /tmp/mysql3307.sock
server-id = 1003307
log-bin = /data/mysql/mysql3307/logs/mysql-bin
(3) 修改相关目录限
# chown -R mysql.mysql /data/mysql/mysql3308/
(4) 初始化 3308 实例数据库
# ./bin/mysqld --defaults-file=/data/mysql/mysql3308/my3308.cnf --initialize
(5) 启动实例 3308
# /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3308/my3308.cnf &
(6) 登录 3308 实例
注意:第一次登录需要用初始密码登录;
# mysql -uroot -p -S /tmp/mysql3308.sock
(7) 修改初始密码
查看初始密码:
# 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;
(8) 设置登录后标识
# cat > /etc/my.cnf << EOF
[mysql]
prompt="\u@\h:\p [\d]> "
EOF
登录后的效果:
root@localhost:mysql3308.sock [(none)]>
三、MySQL 多实例常用操作
1.MySQL 多实例常用命令
启动
/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
2.MySQL 常用命令介绍
方式一:
# /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://www.cnblogs.com/ZhangRuoXu/p/6706427.html 转: http://www.unixfbi.com/324.html