暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL多实例配置

原创 luashin 2020-05-14
1568

1.什么是MySQL多实例?
  简单地说MySQL多实例就是在一台服务器上同时开启多个不同的服务端口(如:3306/3307)同时运行多个MySQL服务进程,这些服务进程通过不同的socket监听不同的服务端口来提供服务。
  这些MySQL多实例共用一套MySQL安装程序,使用不同的my.cnf(也可以相同)配置文件、启动程序(也可以相同)和数据文件。在提供服务时,多实例MySQL在逻辑上看来是各自独立的,他们根据配置文件对应设定值,获得服务器响应数量的资源。

  1. MySQL多实例的作用与问题
    有效利用服务器资源
      当单个服务器资源有剩余时,可以充分利用剩余的资源提供更多的服务,且可以实现资源的逻辑隔离

节约服务器资源
  当公司资金紧张,但是数据库又需要各自尽量独立地提供服务,而且,需要主从复制等技术时,多实例就再好不过了
  MySQL多实例有它的好处,但也有弊端,比如,会存在资源互相抢占的问题。当某个数据库实例并发很高或有SQL慢查询时,整个实例会消耗大量的系统CPU、磁盘I/O等资源,导致服务器上的其它数据库实例提供服务的质量一起下降。

  1. 多实例配置思路
    方法一、各实例单独配置
    1、多套配置文件
    2、多套数据
    3、多个socket
    4、多个端口
    5、多个日志文件
    6、多个启动程序

  2. 多实例配置过程
    前期MySQL的安装与其它MySQL的安装一致,在这里就不再重复(配置完成不要启动)
    第一个里程碑:多实例配置文件准备
    [root@db02 /]# tree /data/
    /data/
    ├── 3306
    │ ├── my.cnf
    │ └── mysql
    └── 3307
    ├── my.cnf
    └── mysql

3306端口my.cnf配置文件
[root@db02 /]# cat data/3306/my.cnf
[client]
port = 3306
socket = /data/3306/mysql.sock

[mysqld]
user = mysql
port = 3306
socket = /data/3306/mysql.sock
basedir = /application/mysql
datadir = /data/3306/data
log-bin = /data/3306/mysql-bin
server-id = 6

[mysqld_safe]
log-error=/data/3306/mysql_3306.err
pid-file=/data/3306/mysqld.pid

3307端口my.cnf配置文件
[root@db02 /]# cat /data/3307/my.cnf
[client]
port = 3307
socket = /data/3307/mysql.sock

[mysqld]
user = mysql
port = 3307
socket = /data/3307/mysql.sock
basedir = /application/mysql
datadir = /data/3307/data
log-bin = /data/3307/mysql-bin
server-id = 7

[mysqld_safe]
log-error=/data/3307/mysql_3307.err
pid-file=/data/3307/mysqld.pid

编写管理脚本3306
[root@db02 /]# cat data/3306/mysql
#!/bin/sh
#3306 start scripts
#init
port=3306
mysql_user=“root”
CmdPath="/application/mysql/bin"
mysql_sock="/data/{port}/mysql.sock" mysqld_pid_file_path=/data/3306/3306.pid start(){ if [ ! -e "mysql_sock" ];then
printf “Starting MySQL…\n”
/bin/sh CmdPath/mysqldsafedefaultsfile=/data/{CmdPath}/mysqld_safe --defaults-file=/data/{port}/my.cnf --pid-file=mysqld_pid_file_path 2>&1 > /dev/null & sleep 3 else printf "MySQL is running...\n" exit 1 fi } stop(){ if [ ! -e "mysql_sock" ];then
printf “MySQL is stopped…\n”
exit 1
else
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
fi
}

restart(){
printf “Restarting MySQL…\n”
stop
sleep 2
start
}

case “1"instart)start;;stop)stop;;restart)restart;;)printf"Usage:/data/1" in start) start ;; stop) stop ;; restart) restart ;; *) printf "Usage: /data/{port}/mysql {start|stop|restart}\n”
esac

编写管理脚本3307
[root@db02 /]# cat data/3307/mysql
#!/bin/sh
#3307 start scripts
#init
port=3307
mysql_user=“root”
CmdPath="/application/mysql/bin"
mysql_sock="/data/{port}/mysql.sock" mysqld_pid_file_path=/data/3307/3307.pid start(){ if [ ! -e "mysql_sock" ];then
printf “Starting MySQL…\n”
/bin/sh CmdPath/mysqldsafedefaultsfile=/data/{CmdPath}/mysqld_safe --defaults-file=/data/{port}/my.cnf --pid-file=mysqld_pid_file_path 2>&1 > /dev/null & sleep 3 else printf "MySQL is running...\n" exit 1 fi } stop(){ if [ ! -e "mysql_sock" ];then
printf “MySQL is stopped…\n”
exit 1
else
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
fi
}

restart(){
printf “Restarting MySQL…\n”
stop
sleep 2
start
}

case “1"instart)start;;stop)stop;;restart)restart;;)printf"Usage:/data/1" in start) start ;; stop) stop ;; restart) restart ;; *) printf "Usage: /data/{port}/mysql {start|stop|restart}\n”
esac
注意:脚本要给继续权限才能够正常使用

第二个里程碑:创建数据目录并授权
[root@db02 /]# mkdir /data/{3306,3307}/data -p
[root@db02 /]# chown -R mysql.mysql /data/

第三个里程碑:初始化数据
cd /application/mysql/scripts &&
./mysql_install_db --defaults-file=/data/3306/my.cnf --basedir=/application/mysql --datadir=/data/3306/data --user=mysql
./mysql_install_db --defaults-file=/data/3307/my.cnf --basedir=/application/mysql --datadir=/data/3307/data --user=mysql

第四个里程碑:创建日志文件
#5.6.40特殊性:需要创建错误日志文件
touch /data/3306/mysql_3306.err
touch /data/3307/mysql_3307.err

第五个里程碑:启动多实例
[root@db02 scripts]# /data/3306/mysql start
Starting MySQL…

[root@db02 scripts]# /data/3307/mysql start
Starting MySQL…

检查MySQL状态
[root@db02 scripts]# ps -ef |grep [my]sql
root 4341 1 0 16:46 pts/1 00:00:00 /bin/sh /application/mysql/bin/mysqld_safe --defaults-file=/data/3306/my.cnf --pid-file=/data/3306/3306.pid
mysql 4526 4341 13 16:46 pts/1 00:00:03 /application/mysql/bin/mysqld --defaults-file=/data/3306/my.cnf --basedir=/application/mysql --datadir=/data/3306/data --plugin-dir=/application/mysql/lib/plugin --user=mysql --log-error=/data/3306/mysql_3306.err --pid-file=/data/3306/3306.pid --socket=/data/3306/mysql.sock --port=3306
root 4549 1 0 16:46 pts/1 00:00:00 /bin/sh /application/mysql/bin/mysqld_safe --defaults-file=/data/3307/my.cnf --pid-file=/data/3307/3307.pid
mysql 4734 4549 51 16:46 pts/1 00:00:08 /application/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf --basedir=/application/mysql --datadir=/data/3307/data --plugin-dir=/application/mysql/lib/plugin --user=mysql --log-error=/data/3307/mysql_3307.err --pid-file=/data/3307/3307.pid --socket=/data/3307/mysql.sock --port=3307

检查端口信息
[root@db02 scripts]# netstat -lntup |grep mysql
tcp 0 0 :::3306 ::😗 LISTEN 4526/mysqld
tcp 0 0 :::3307 ::😗 LISTEN 4734/mysqld
至此MySQL的多实例就配置完成

  1. 多实例MySQL的使用
    本地连接方式
    mysql -S /data/3306/mysql.sock
    mysql -S /data/3307/mysql.sock

方法二、实例集中配置
Step 1 准备工作
关闭防火墙; 安装MySQL依赖库libaio;下载、解压、重命名MySQL的执行文件;新建组和用户等准备工作在此不再赘述。
可执行文件目录为/data/mysql57

添加用户和组的指令
groupadd mysql
useradd mysql -g mysql

Step 2 添加环境变量
在/etc/profile文件中,追加 PATH={PATH}:/data/mysql57/bin/ echo ”PATH={PATH}:/data/mysql57/bin/” >> /etc/profile
保存后,如需要立即生效,可执行
source /etc/profile

Step 3 创建目录并授权
在data根目录下执行
mkdir -p mysql3306/data mysql3306/mysql_log mysql3306/tmp mysql3307/data mysql3307/mysql_log mysql3307/tmp mysqld_multi/log

创建记录log的文件,此步骤不可少。
touch /data/mysql3306/mysql_log/mysql3306.err
touch /data/mysql3307/mysql_log/mysql3307.err
赋予目录和文件权限
chown -R mysql.mysql mysql3* mysqld_multi
在本测试案例中,mysql57是从其它服务上copy来的,不是直接下载解压的,所以多了下面的两步授权操作。
chmod -R 755 /data/mysql57/bin
chmod -R 755 /data/mysql57/support-files

Step 4 编辑my.cnf
vim /etc/my.cnf
[client]
host = localhost
socket = /tmp/mysql.sock
default-character-set = utf8mb4
#loose-local-infile = 0

[mysqld]
user = mysql
log_bin_trust_function_creators = 1
secure_file_priv = ‘/tmp’

########server setting#######
sql_mode = “ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”
character-set-server = utf8mb4
collation_server = utf8mb4_unicode_ci
lower_case_table_names = 0
skip_name_resolve = 1
#max_connect_errors = 1000
max_connections = 2000
thread_cache_size = 256
#thread_stack = 262144
#back_log = 80
max_allowed_packet = 134217728
event_scheduler = 1
local-infile = 0
#lower_case_table_names = 1
explicit_defaults_for_timestamp = 1
expire_logs_days = 7
log_bin_trust_function_creators =1

####.frm .ibd files qty related
open_files_limit = 65535
innodb_open_files = 65535
table_open_cache = 65535
table_definition_cache = 65535

seesion buffer related

read_buffer_size = 262144
read_rnd_buffer_size = 524288
sort_buffer_size = 8388608
join_buffer_size = 8388608

####memory table size
tmp_table_size = 67108864
max_heap_table_size = 67108864

####timeout
interactive_timeout = 1800
wait_timeout = 1800

connect_timeout = 10

########slow query ########
slow_query_log = 1
log_slow_slave_statements = 1
#log_queries_not_using_indexes = 1
log_throttle_queries_not_using_indexes = 10
long_query_time = 1
#min_examined_row_limit = 10000

########innodb settings########
innodb_buffer_pool_size = 10737418240
innodb_buffer_pool_instances = 16
innodb_buffer_pool_dump_pct = 40
innodb_lru_scan_depth = 2048
innodb_page_cleaners = 16
#innodb_purge_threads = 4
innodb_sort_buffer_size = 67108864
#innodb_file_per_table = 1
#innodb_flush_log_at_trx_commit = 1

innodb_undo_log_truncate = 1
innodb_undo_tablespaces = 3
innodb_max_undo_log_size = 2147483648
innodb_purge_rseg_truncate_frequency = 128

innodb_log_file_size = 1073741824
innodb_log_files_in_group = 3
innodb_log_buffer_size = 16777216
innodb_flush_method = O_DIRECT
innodb_flush_neighbors = 0
innodb_print_all_deadlocks = 1

innodb_strict_mode = 1
#innodb_lock_wait_timeout = 50

innodb_io_capacity = 32768
innodb_io_capacity_max = 65536
innodb_thread_concurrency = 32
innodb_write_io_threads = 8
innodb_read_io_threads = 8

########replication settings########
master_info_repository = TABLE
relay_log_info_repository = TABLE

gtid_mode = on
enforce_gtid_consistency = 1
binlog_gtid_simple_recovery = 1
relay_log_recovery = 1

slave-parallel-type = LOGICAL_CLOCK
slave-parallel-workers = 16
slave_transaction_retries = 128
slave_preserve_commit_order = 1

log_slave_updates = 1
binlog_format = ROW
log_timestamps = system

binlog_rows_query_log_events = 1
binlog_row_image = ‘full’
slave_skip_errors = ddl_exist_errors

########semi sync replication settings########
#plugin_dir = /data/mysql/plugin/
#plugin_load = “rpl_semi_sync_master=semisync_master.so;
#rpl_semi_sync_slave = semisync_slave.so”
#rpl_semi_sync_master_enabled = 1
#rpl_semi_sync_master_timeout = 5000
#rpl_semi_sync_slave_enabled = 1

[mysqld_multi]
mysqld = /data/mysql57/bin/mysqld_safe
mysqladmin = /data/mysql57/bin/mysqladmin
log = /data/mysqld_multi/log/mysqld_multi.log

[mysqld3306]
basedir = /data/mysql57
mysqladmin = mysqladmin
datadir = /data/mysql3306/data
port = 3306
server_id = 102473306
socket = /tmp/mysql_3306.sock
tmpdir = /data/mysql3306/tmp
pid-file = /data/mysql3306/mysql_log/mysql3306.pid
slow_query_log_file = /data/mysql3306/mysql_log/mysql3306_slow_new.log
log-error = /data/mysql3306/mysql_log/mysql3306.err
general_log_file = /data/mysql3306/mysql_log/mysql3306.genlog
log-bin = /data/mysql3306/mysql_log/mysql3306_bin
relay_log = /data/mysql3306/mysql_log/relay3306.log

innodb_buffer_pool_size = 90G
innodb_buffer_pool_instances = 8

[mysqld3307]
basedir = /data/mysql57
mysqladmin = mysqladmin
datadir = /data/mysql3307/data
port = 3307
server_id = 102473307
socket= /tmp/mysql_3307.sock
tmpdir = /data/mysql3307/tmp
pid-file = /data/mysql3307/mysql_log/mysql3307.pid
slow_query_log_file = /data/mysql3307/mysql_log/mysql3307_slow_new.log
log-error = /data/mysql3307/mysql_log/mysql3307.err
general_log_file = /data/mysql3307/mysql_log/mysql3307.genlog
log-bin = /data/mysql3307/mysql_log/mysql3307_bin
relay_log = /data/mysql3307/mysql_log/relay3307.log

innodb_buffer_pool_size = 90G
innodb_buffer_pool_instances = 8

[mysqldump]
quick

Step 5 初始化实例
初始化3306端口的实例,注意产生的临时密码。
/data/mysql57/bin/mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql --basedir=/data/mysql57 --datadir=/data/mysql3306/data

初始化3307端口的实例,注意产生的临时密码。
/data/mysql57/bin/mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql --basedir=/data/mysql57 --datadir=/data/mysql3307/data

Step 6 复制生成mysqld_multi并添加到开机启动
cp -v /data/mysql57/support-files/mysqld_multi.server /etc/init.d/mysqld_multi
chkconfig --add mysqld_multi

Step 7 多实例mysqld的开启
开启全部实例
mysqld_multi start

查看开启情况(查看全部实例状态)
mysqld_multi report

开启指定实例
开启/etc/my.cnf中[mysqld3306]其中mysqld后面的数字为标签,例如3306标签
mysqld_multi start 3306
同样开启3307标签实例
mysqld_multi start 3307
(注意:此处没有说通过 mysqld_multi stop 命令进行关闭实例,为什么不说,因为命令无效。Step 9 的操作会让它变成有效)

Step 8 第一次登入实例,修改root账号密码
多实例登入需指定 socket 参数
本测试3306实例登入的方式为:
mysql -S /tmp/mysql_3306.sock -uroot --port 3306 -p
mysql> alter user ’root’@’localhost’ identified by with mysql native_password by ’mysql’;
mysql> flush privileges;
mysql> exit

Step 9 赋予通过mysqld_multi stop关闭实例的权限。
关闭实例需要配置root用户及密码,修改/etc/my.cnf文件。
在[client]位置添加
user = root
password = mysql
因为文件中需要保留账号密码,有安全风险。实际环境中要不要如此设置,还需根据具体情况和安全要求而定。
经过以上步骤的操作,此服务器成功安装了2个MySQL实例,一个Port为3306,另一个Port为3307

  1. 关于MySQL多实例的选择
    1、资金紧张性公司的选择
      资金紧张公司业务访问量又不大,但又希望不同的业务的数据库服务各自尽量独立
    2、并发访问不是特别大的业务
      当公司业务访问量不太大时,服务器的资源基本都是浪费的,这就适合多实例的使用
    3、门户网站应用MySQL多实例场景
      配置硬件好的服务器,可以节省IDC机柜空间,跑多实例也不会减少硬件资源不慢的浪费
      一般是从库多实例,例如:某部门使用IBM服务器为48核CPU,内存96GB、一台服务器跑3~4个实例:此外,Sina网也是用的多实例,内存48GB左右。企业环境中一般将多实例应用在测试环境。

  2. MySQL忘记密码怎么办?
    第一步:将服务停掉
    /etc/init.d/mysqld stop

第二步:加参数启动服务
cd /application/mysql/bin/
mysqld_safe --skip-grant-table --user=mysql --skip-networking &
这种模式下无密码登陆,网络用户无法登陆,只能本地登陆,和授权有关的命令都无法执行

第三步:修改密码
[root@db02 3306]# mysql
mysql> update mysql.user set password=password(‘123’) where user=‘root’ and host=‘localhost’;
mysql> flush privileges;

MySQL 5.7 修改密码修改字段
mysql> update mysql.authentication_string set password=password(‘123’) where user=‘root’ and host=‘localhost’;

第四步:退出重启服务
/etc/init.d/mysqld restart

第五步:登录验证
mysql -uroot -p123
至此密码修改成功!

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论