MySQL数据库安装实践 Part 2:多实例部署

1 MySQL多实例介绍

        MySQL多实例是在一台服务器同时开启多个不同服务端口(例如 3306、3307),同时运行多个MySQL服务进程,这些服务进程通过不同的socket监听不同的服务端口来提供服务。

        MySQL多实例公用一套安装程序,使用不同的my.cnf配置文件、启动程序和数据文件。提供服务时,多个实例是相互独立的,根据配置文件的对应配置获取服务器的资源。

1.1 MySQL多实例优势

        

1.2  MySQL多实例问题

        存在资源争抢,当某实例并发很高或者SQL慢查询时,会消耗大量CPU、磁盘I/O等资源,此时服务器整体性能下降,导致其他实例资源紧张。实例获取资源是相对独立的,无法与虚拟化一样完全隔离。

2 MySQL多实例的应用场景

  • 有效利用服务器资源,单个服务器资源剩余时,可以充分利用剩余资源提供更多服务,且实现资源逻辑隔离
  • 节约服务器资源,资金紧张,但数据库要求独立地提供服务,而且需要用到主从复制技术,那么多实例是最好的选择

2.1 资金紧张

        企业资金紧张,业务访问量较少,但数据库服务各自独立地提供服务。例如,4台服务器,部署约16个实例,交叉主从复制、数据备份及读写分离。

2.2 并发访问量小

        业务并发访问量小,服务器资源过剩,此时建议部署多实例。

3 MySQL多实例常见的配置方案

3.1 集中配置、统一启停

        MySQL官方文档介绍的单一配置文件、单一启动程序多实例部署方案。配置文件如下:

[mysqld_multi]
mysqld = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user = mysql

[mysqld]
socket = /var/lib/mysql/mysql.sock
port = 3306
pid-file = /var/lib/mysql/mysql.pid
datadir = /var/lib/mysql
user = mysql

[mysqld2]
socket = /app/mysql/db1/mysql.sock
port = 3307
pid-file = /app/mysql/db1/mysql.pid
datadir = /app/mysql/db1
user = mysql

skip-name-resolve
server-id = 10
default-storage-engine = innodb
innodb_buffer_pool_size = 512M
innodb_additional_mem_pool = 10M
default_character_set = utf8
character_set_server = utf8
relay-log-space-limit = 2048M
expire_logs_day = 30

启动命令:

mysqld_multi --config-file=/app/mysql/my_multi.cnf start 1,2

注:此方案耦合度高,单一配置文件,不易管理。

3.2 分散配置、独立启停

        多配置文件、独立启动程序部署

[root@node1 ~]# tree /app
/app
|-- 3306
|   |-- data
|   |-- my.cnf
|   `-- mysql
`-- 3307
    |-- data
    |-- my.cnf
    `-- mysql
4 directories, 4 files

注:配置文件、启动程序和数据文件目录都是独立的

4 MySQL多实例部署

4.1 安装多实例

4.1.1 安装依赖包

--- 查看依赖包

rpm -qa | grep ncurses-devel libaio-devel

--- 安装依赖包

yum install ncurses-devel libaio-devel -y

4.1.2 安装编译软件

--- 查看cmake包

rpm -qa | grep cmake

--- 安装cmake

yum install cmake

4.1.3 创建mysql用户

useradd -s /sbin/nologin -M mysql

4.1.4 获取mysql软件包

        MySQL下载地址:https://downloads.mysql.com/archives/community/

        MySQL 源码包:mysql-5.7.24.tar.gz

4.1.5 编译安装mysql

        参考《MySQL数据库安装实践》2.1.2章节

4.2 创建多实例数据目录

        /app 作为多实例的根目录,以服务端口号命名各个实例的数据目录

--- 创建多级目录

mkdir -p /multinst/{3306,3307}/{data,tmp,log}

--- 查看目录结构

tree /multinst

4.3 配置多实例my.cnf

--- 备份my.cnf

mv /etc/my.cnf /etc/my.cnf.bak

--- 配置my.cnf

vi /multinst/3306/my.cnf

[client]

port = 3306
socket = /multinst/3306/tmp/mysql.sock

[mysqld]

basedir = /multinst/3306
datadir = /multinst/3306/data
user = mysql
port = 3306
socket = /multinst/3306/tmp/mysql.sock
log-bin = /multinst/3306/log/mysql-bin
server-id = 6

[mysqld_safe]

log-error = /multinst/3306/log/my_3306.err
pid-file = /multinst/3306/mysqld.pid

vi /multinst/3307/my.cnf

[client]

port = 3307
socket = /app/3307/tmp/mysql.sock

[mysqld]

basedir = /multinst/3307
datadir = /multinst/3307/data
user = mysql
port = 3307
socket = /multinst/3307/tmp/mysql.sock
log-bin = /multinst/3307/log/mysql-bin
server-id = 7

[mysqld_safe]

log-error = /multinst/3307/log/my_3307.err
pid-file = /multinst/3307/mysqld.pid

4.4 配置多实例启动文件

        启动文件与配置文件一样,可以通过vi命令配置

--- 配置启动文件

cp /app/mysql5.7/support-files/mysql.server /multinst/3306/mysql

vi /multinst/3306/mysql


cp /app/mysql5.7/support-files/mysql.server /multinst/3307/mysql

vi /multinst/3307/mysql

注:唯一需要修改的配置项"port"

        多实例启动时,需指定配置文件

--- 启动3306实例

mysqld_safe --defaults-file=/multinst/3306/my.cnf > /dev/null 2>&1&

--- 启动3307实例

mysqld_safe --defaults-file=/multinst/3307/my.cnf > /dev/null 2>&1&

        多实例停止服务可以通过kill方式和mysqladmin方式来完成

--- kill方式

vi stop.sh

printf "Stoping MySQL...\n"
mysqld_pid = `cat "$mysqld_pid_file_path"`
if ( kill -0 $mysqld_pid 2 > /dev/null )
    then
        kill $mysqld_pid
        sleep 2
fi

--- mysqladmin方式

mysqladmin -u root -proot123456 -S /multinst/3306/tmp/mysql.sock shutdown

mysqladmin -u root -proot123456 -S /multinst/3307/tmp/mysql.sock shutdown

4.5 多实例文件权限

--- MySQL目录授权用户、组

chown -R mysql.mysql /multinst

find /multinst -name mysql | xargs ls -l 

--- 配置mysql启动文件权限

find /multinst -name mysql | xargs chmod 700

--- 检查权限

find /multinst -name mysql exec ls -l {} \;

4.6 MySQL命令添加到全局路径

        之前配置启动和停止mysql都使用的绝对路径‘/app/mysql/bin/mysql’,很繁琐。添加全局路径后可直接敲mysql。下面来看看配置方法

--- profile中添加mysql路径

echo 'export PATH=/app/mysql/bin:$PATH' >> /etc/profile

--- 查看profile配置

tail -l /etc/profile

--- 生效变更的配置

source /etc/profile

--- 查看PATH

echo $PATH

        软连接方式

--- mysql所有命令软连接到全局路径下

ln -s /app/mysql/bin/* /usr/local/sbin

4.7 初始化MySQL数据库文件

--- 初始化数据库

cd /app/mysql5.7/bin

/app/mysql/bin/mysqld --no-defaults --initialize --basedir=/multinst/3306 --datadir=/multinst/3306/data --lc-messages-dir=/app/mysql/share --lc-messages=utf8mb4 --user=mysql

/app/mysql/bin/mysqld --no-defaults --initialize --basedir=/multinst/3307 --datadir=/multinst/3307/data --lc-messages-dir=/app/mysql/share --lc-messages=utf8mb4 --user=mysql

--- 核验数据文件

tree /multinst

4.8 启动多实例

--- 创建tmp目录

mkdir -p /multinst/3306/tmp /multinst/3307/tmp

chown -R mysql.mysql /multinst

--- 停止系统所有mysql服务

/etc/init.d/mysqld stop

chkconfig mysqld off

chkconfig --list | grep mysqld

--- 启动3306实例

/app/3306/mysql start

/app/mysql5.7/bin/mysqld_safe --defaults-file=/multinst/3306/my.cnf > /dev/null 2>&1&

--- 启动3307实例

/app/3307/mysql start

/app/mysql5.7/bin/mysqld_safe --defaults-file=/multinst/3307/my.cnf > /dev/null 2>&1&

--- 检查多实例启动情况

netstat -lntup | grep 330

5 多实例数据库的管理与配置

5.1 多实例数据库自启动配置

vi /etc/rc.d/rc.local

#mysql multi instances

mysqld_safe --defaults-file=/multinst/3306/my.cnf > /dev/null 2>&1&

mysqld_safe --defaults-file=/multinst/3307/my.cnf > /dev/null 2>&1&

5.2 多实例数据库管理

        MySQL5.7多实例登录时,需要指定实例的sock路径及mysql.sock文件并且用到初始化的临时密码,通过"-S"参数设置sock文件

--- 使用临时密码登录

mysql -uroot -p'eiSjqq<u5jGX' -S /multinst/3306/tmp/mysql.sock

mysql -uroot -p'bXtBd9Fgy#u5' -S /multinst/3307/tmp/mysql.sock

--- 首次登录后需更改密码才能查询数据

ALTER USER USER() IDENTIFIED BY 'root1234';

5.3 多实例数据库安全配置

        MySQL5.6及以前版本的root密码默认为空,可以通过mysqladmin配置实例的管理员密码。MySQL5.7初始化

--- MySQL 5.6 及以前版本,多实例初次配置密码

mysqladmin -u root -S /multinst/3306/tmp/mysql.sock password 'root123456'

mysqladmin -u root -S /multinst/3307/tmp/mysql.sock password 'root123456'

--- MySQL 5.7版本,多实例初次配置密码

使用临时密码登录mysql后,使用alter user配置密码

--- 登录实例

mysql -uroot -p -S /multinst/3306/tmp/mysql.sock

mysql -uroot -p'root1234' -S /multinst/3306/tmp/mysql.sock

mysql -uroot -p -S /multinst/3307/tmp/mysql.sock

mysql -uroot -p'root1234' -S /multinst/3307/tmp/mysql.sock

--- MySQL 5.7 修改密码,需登录mysql后使用"alter user"或"update"进行操作

UPDATE user set password=password('root123') where user='root' and host='localhost';

FLUSH PRIVILEGES;

附件

my.cnf参考配置

[client]
port = 3307
socket = /multinst/3307/tmp/mysql3307.sock

[mysql]
auto-rehash

[mysqld]
user = mysql
port = 3307
socket= /multinst/3307/tmp/mysql3307.sock
pid-file = /multinst/3307/mysql3307.pid
datadir = /multinst/3307/data
basedir = /multinst/3307
log-error = /multinst/3307/log/my3307.err

skip_name_resolve = 1 
skip-external-locking 
max_connections = 3000
max_connect_errors = 10 
transaction_isolation = READ-COMMITTED
interactive_timeout=86400
wait_timeout=86400
back_log=600

####cache######  
table_open_cache=2000 
thread_cache_size=500
query_cache_size=128M
query_cache_min_res_unit=128k
sort_buffer_size=2M
read_buffer_size=2M
read_rnd_buffer_size=4M
join_buffer_size=2M
bulk_insert_buffer_size=16M
max_heap_table_size=64M
tmp_table_size=64M

###MyISAM####
key_buffer_size=64M
key_cache_block_size=4k
myisam_sort_buffer_size=2M

########innodb settings########
#innodb_page_size = 4k
innodb_buffer_pool_size = 1G
innodb_buffer_pool_instances = 1
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
#innodb_lru_scan_depth = 2000
innodb_lock_wait_timeout = 50
#innodb_io_capacity = 4000
#innodb_io_capacity_max = 8000
innodb_flush_method = O_DIRECT
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
innodb_log_group_home_dir = /multinst/3307/redolog/
innodb_undo_directory = /multinst/3307/undolog/
innodb_undo_logs = 128
#innodb_undo_tablespaces = 3
innodb_flush_neighbors = 1
innodb_log_file_size = 256M
innodb_log_buffer_size = 8M
innodb_purge_threads = 4
innodb_large_prefix = 1
innodb_thread_concurrency = 64
innodb_print_all_deadlocks = 1
innodb_strict_mode = 1
innodb_sort_buffer_size = 4M

######mysqld-5.7########
innodb_buffer_pool_dump_pct = 40
innodb_page_cleaners = 4
innodb_undo_log_truncate = 1
innodb_max_undo_log_size = 2G
innodb_purge_rseg_truncate_frequency = 128
binlog_gtid_simple_recovery=1
log_timestamps=system
transaction_write_set_extraction=MURMUR32
show_compatibility_56=on

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 

#skip-grant-tables

 

相关链接

MySQL数据库分类与版本升级

MySQL数据库安装实践 Part 1:单实例部署

参考 《MySQL 5.7 Reference Manual》、《MySQL Source-Configuration Options

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值