一、多实例的应用场景:
1、资金紧张型公司的选择
当公司业务访问量不太大,又舍不得花钱,但同时又希望不同业务的数据库服务各自独立,而且需要主从同步进行等技术提供备份或读写分离服务时,使用多实例是最好不过的。
2、并发访问不是特别大的业务
当公司业务访问量不太大,服务器资源基本闲置的比较多,这是就很适合多实例的应用。如果对SQL语句优化的好,多实例是一个很值得使用的技术。即使并发很大,只要合理分配好系统资源,也不会有太大问题。
二、mysql多实例的原理
mysql多实例,简单的说,就是在一台服务器上开启多个不同的mysql服务端口(如3306,3307),运行多个mysql服务进程。这些服务进程通过不同的socket监听不同的服务端口,来提供各自的服务。
这些mysql实例共用一套mysql安装程序,使用不同的my.cnf配置文件、启动程序、数据文件。在提供服务时,mysql多实例在逻辑上看来是各自独立的,各个实例之间根据配置文件的设定值,来取得服务器的相关硬件资源。
三、多实例部署步骤
在这里数据库的编译安装就不赘述了,如有不清楚的,请参考其他文件。
实验使用的端口:33064,33065
1、创建数据目录
创建数据文件存放目录,并修改文件夹的所属用户组
mkdir -p /home/mysqldata/33064
mkdir -p /home/mysqldata/33065
chown mysql.mysql 33064/33065/
2、初始化数据库:
/usr/bin/mysql_install_db\
–datadir=/home/mysqldata/33064/\
–user=mysql
/usr/bin/mysql_install_db\
–datadir=/home/mysqldata/33065/\
–user=mysql
3、配置/etc/my.cnf配置文件
每一个实例都有一个属于实例自己的msyqld模块,模块中是实例对应的初始化参数,例如[mysqld33064],[mysqld33065]
[root@model /]# cat /etc/my.cnf
[mysqld_multi]
mysqld=/usr/bin/mysqld_safe
mysqladmin=/usr/bin/mysqladmin
user=mysql
password=mysql
[mysqld33064]
datadir=/home/mysqldata/33064
port=33064
socket=/home/mysqldata/33064/mysql33064.sock
user=mysql
symbolic-links=0
default-storage-engine=INNODB
log-bin = mysql-bin
binlog_format = mixed
expire_logs_days = 7
## utf8
#default-character-set = utf8
#character_set_connection = utf8
#character_set_results = utf8
character-set-server = utf8
collation-server = utf8_general_ci
init_connect = ‘SET collation_connection =utf8_general_ci ‘
init_connect = ‘SET NAMES utf8’
server-id = 1
[mysqld33065]
datadir=/home/mysqldata/33065
port=33065
socket=/home/mysqldata/33065/mysql33065.sock
user=mysql
symbolic-links=0
default-storage-engine=INNODB
log-bin = mysql-bin
binlog_format = mixed
expire_logs_days = 7
## utf8
#default-character-set = utf8
#character_set_connection = utf8
#character_set_results = utf8
character-set-server = utf8
collation-server = utf8_general_ci
init_connect = ‘SET collation_connection =utf8_general_ci ‘
init_connect = ‘SET NAMES utf8’
server-id = 1
[mysqld_safe]
#log=/var/log/mysqldquery.log
## error log
log-error=/var/log/mysqld.log
#pid-file=/var/run/mysqld/mysqld.pid
4、多实例的启动和停止
启动的时候要用mysqld_multi 命令,而不是mysqld命令,命令通过传递不同的端口参数来启动对应额数据库实例.
/usr/bin/mysqld_multi –defaults-file=/etc/my.cnf start 33064
/usr/bin/mysqld_multi –defaults-file=/etc/my.cnf start 33065
/usr/bin/mysqld_multi –defaults-file=/etc/my.cnf stop 33064
/usr/bin/mysqld_multi –defaults-file=/etc/my.cnf stop 33065
查看数据库进程情况,如果有两个数据库进程说明数据库安装正常,否则失败,具体原因需要查看log日志来处理。
[root@model mysql]# ps -ef|grep mysql
root 3990 1 0 11:18 pts/0 00:00:00 /bin/sh /usr/bin/mysqld_safe –datadir=/home/mysqldata/33065 –port=33065 –socket=/home/mysqldata/33065/mysql33065.sock –user=mysql –symbolic-links=0 –default-storage-engine=INNODB –log-bin=mysql-bin –binlog_format=mixed –expire_logs_days=7 –character-set-server=utf8 –collation-server=utf8_general_ci –init_connect=SET collation_connection = utf8_general_ci –init_connect=SET NAMES utf8 –server-id=1
mysql 4132 3990 0 11:18 pts/0 00:00:01 /usr/libexec/mysqld –basedir=/usr –datadir=/home/mysqldata/33065 –user=mysql –symbolic-links=0 –default-storage-engine=INNODB –log-bin=mysql-bin –binlog_format=mixed –expire_logs_days=7 –character-set-server=utf8 –collation-server=utf8_general_ci –init_connect=SET collation_connection = utf8_general_ci –init_connect=SET NAMES utf8 –server-id=1 –log-error=/var/log/mysqld.log –pid-file=/home/mysqldata/33065/model.pid –socket=/home/mysqldata/33065/mysql33065.sock –port=33065
root 4155 1 0 11:18 pts/0 00:00:00 /bin/sh /usr/bin/mysqld_safe –datadir=/home/mysqldata/33064 –port=33064 –socket=/home/mysqldata/33064/mysql33064.sock –user=mysql –symbolic-links=0 –default-storage-engine=INNODB –log-bin=mysql-bin –binlog_format=mixed –expire_logs_days=7 –character-set-server=utf8 –collation-server=utf8_general_ci –init_connect=SET collation_connection = utf8_general_ci –init_connect=SET NAMES utf8 –server-id=1
mysql 4297 4155 0 11:18 pts/0 00:00:01 /usr/libexec/mysqld –basedir=/usr –datadir=/home/mysqldata/33064 –user=mysql –symbolic-links=0 –default-storage-engine=INNODB –log-bin=mysql-bin –binlog_format=mixed –expire_logs_days=7 –character-set-server=utf8 –collation-server=utf8_general_ci –init_connect=SET collation_connection = utf8_general_ci –init_connect=SET NAMES utf8 –server-id=1 –log-error=/var/log/mysqld.log –pid-file=/home/mysqldata/33064/model.pid –socket=/home/mysqldata/33064/mysql33064.sock –port=33064
5、多实例的连接登录
mysql -S /home/mysqldata/33064/mysql33064.sock
mysql -S /home/mysqldata/33065/mysql33065.sock
6、赋权限
刚安装好的数据库root用户无localhost登录权限,所以需要赋权限以后才能通过用户名和密码登录。
mysql -S /home/mysqldata/33064/mysql33064.sock
mysql>grant allon *.* to ‘root’@’%’ identified by ‘root’;
mysql>grant allon *.* to ‘root’@’localhost’ identified by ‘root’;
mysql> flushprivileges;
7、通过用户名和密码登录
mysql -uroot -proot -S /home/mysqldata/33064/mysql33064.sock
8、多实例修改密码
修改实例33064的root密码,使用mysqladmin命令。如下:
mysqladmin -uroot -p password root-S /home/mysqldata/33064/mysql33064.sock
到此我们的mysql多实例部署就已经完成。