手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

MySQL单机多实例配置

[日期:2014-07-22] 来源:Linux社区  作者:skypegnu1 [字体: ]

测试环境:

操作系统 CentOS 6.4 x86

MySQL 5.5.38

1、什么是MySQL多实例?

  MySQL多实例就是在一台机器上开启多个不同的服务端口(如:3306,3307,3308),运行多个MySQL服务进程,通过不同的socket监听不同的服务端口来提供各自的服务。各个实例之间是相互独立的,每个实例的datadir, port, socket, pid都是不同的。

2、MySQL多实例的特点
•有效利用服务器资源,当单个服务器资源有剩余时,可以充分利用剩余的资源提供更多的服务。

•资源互相抢占问题,当某个服务实例服务并发很高时或者开启慢查询时,会消耗更多的内存、CPU、磁盘IO资源,导致服务器上的其他实例提供服务的质量下降。

3、应用场景
•采用了数据伪分布式架构的原因,而项目启动初期又不一定有那多的用户量,为此先一组物理数据库服务器,但部署多个实例,方便后续迁移;

•为规避mysql对SMP架构不支持的缺陷,使用多实例绑定处理器的办法,把不同的数据库分配到不同的实例上提供数据服务;

•一台物理数据库服务器支撑多个数据库的数据服务,为提高mysql复制的从机的恢复效率,采用多实例部署;

•已经为双主复制的mysql数据库服务器架构,想部分重要业务的数据多一份异地机房的热备份,而mysql复制暂不支持多主的复制模式,且不给用户提供服务,为有效控制成本,会考虑异地机房部署一台性能超好的物理服务器,甚至外加磁盘柜的方式,为此也会部署多实例;

•传统游戏行业的MMO/MMORPG,以及Web Game,每一个服都对应一个数据库,而可能要做很多数据查询和数据订正的工作,为减少维护而出错的概率,也可能采用多实例部署的方式,按区的概念分配数据库;

4、约定

1、将所有的安装文件、配置文件、数据目录全部放存/mydata/data目录中,便于今后实现快速迁移、整体备份和快速复制;

2、在一台服务器上配置2个MySQL实例,分别绑定在3306、3307端口。

3、实例均采用my-medium.cnf 配置文件;我们可以根据实际需求定制各个实例的my.cnf配置。

my.cnf配置文件有两种方案:
1.
多个实例共用同一个my.cnf配置文件中,利用[mysqld1]、[mysqld2]、[mysqld*]标签实现不同实例的差异化配置;

2.
每一个实例单独一个my.cnf配置文件

Ubuntu 14.04下安装MySQL http://www.linuxidc.com/Linux/2014-05/102366.htm

《MySQL权威指南(原书第2版)》清晰中文扫描版 PDF http://www.linuxidc.com/Linux/2014-03/98821.htm

Ubuntu 14.04 LTS 安装 LNMP Nginx\PHP5 (PHP-FPM)\MySQL http://www.linuxidc.com/Linux/2014-05/102351.htm

Ubuntu 14.04下搭建MySQL主从服务器 http://www.linuxidc.com/Linux/2014-05/101599.htm

Ubuntu 12.04 LTS 构建高可用分布式 MySQL 集群 http://www.linuxidc.com/Linux/2013-11/93019.htm

Ubuntu 12.04下源代码安装MySQL5.6以及Python-MySQLdb http://www.linuxidc.com/Linux/2013-08/89270.htm

--------------------------------------------------------------------------------

第一种方案:每一个实例单独一个my.cnf配置文件

datadir:    /mydata/data/3306


            /mydata/data/3307

my.cnf:    /mydata/data/3306/my.cnf

            /mydata/data/3307/my.cnf

5、安装MySQL(通用二进制方式)

1、创建mysql用户和组

[root@localhost ~]# groupadd -r mysql
[root@localhost ~]# useradd -r -g mysql -s /sbin/nologin mysql
2、目录规划


我们为每个实例单独创建一个目录:3306, 3307
[root@localhost ~]# mkdir -pv /mydata/data/330{6,7}
mkdir: created directory `/mydata/data/3306'
mkdir: created directory `/mydata/data/3307'
[root@localhost ~]# tree /mydata/data/
/mydata/data/
|-- 3306
`-- 3307
3、解压

[root@localhost ~]# tar xf mysql-5.5.38-linux2.6-i686.tar.gz -C /usr/local/src
[root@localhost ~]# cd /usr/local/ 
[root@localhost local]# ln -sv src/mysql-5.5.38-linux2.6-i686/ mysql
create symbolic link `mysql' to `src/mysql-5.5.38-linux2.6-i686/'
4、提供配置文件,并编辑
[root@localhost local]# cd mysql
[root@localhost mysql]# cp support-files/my-medium.cnf /mydata/data/3306/my.cnf
[root@localhost mysql]# cp support-files/my-medium.cnf /mydata/data/3307/my.cnf

# 这里是实验环境,所以简单配置。请各位看官根据实际需求调整

###3306
# The following options will be passed to all MySQL clients
[client]
#password      = your_password
port            = 3306
socket          = /tmp/mysql_3306.sock

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port            = 3306
socket          = /tmp/mysql_3306.sock
pid-file        = /mydata/data/3306/mysql.pid
user            = mysql
basedir        = /usr/local/mysql
datadir        = /mydata/data/3306

###########################################################

###3307
# The following options will be passed to all MySQL clients
[client]
#password      = your_password
port            = 3307
socket          = /tmp/mysql_3307.sock

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port            = 3307
socket          = /tmp/mysql_3307.sock
pid-file        = /mydata/data/3307/mysql.pid
user            = mysql
basedir        = /usr/local/mysql
datadir        = /mydata/data/3307
5、修改数据目录的属主、属组
[root@localhost mysql]# chown -R mysql:mysql /mydata/data/3306
[root@localhost mysql]# chown -R mysql:mysql /mydata/data/3307
6、把mysql/bin目录添加到PATH
[root@localhost mysql]# vi /etc/profile.d/mysql.sh
# 添加
export PATH=$PATH:/usr/local/mysql/bin
[root@localhost mysql]# . /etc/profile.d/mysql.sh
7、初始化
# 初始化 实例1
[root@localhost mysql]# scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/mydata/data/3306 --user=mysql
# 初始化 实例2
[root@localhost mysql]# scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/mydata/data/3307 --user=mysql
8、启动/关闭 实例


这里有一个问题,每个实例如何读取各自的my.cnf配置文件呢? 我们需要手动指定


/usr/local/mysql/bin/mysqld_safe


--defaults-file    手动指定配置文件


### 启动实例
[root@localhost mysql]# /usr/local/mysql/bin/mysqld_safe  --defaults-file=/mydata/data/3306/my.cnf &>/dev/null &
[1] 1526
[root@localhost mysql]# /usr/local/mysql/bin/mysqld_safe  --defaults-file=/mydata/data/3307/my.cnf &>/dev/null &
[2] 1832

[root@localhost mysql]# netstat -tulpn | grep -i mysql
tcp        0      0 0.0.0.0:3306          0.0.0.0:*          LISTEN      1815/mysqld       
tcp        0      0 0.0.0.0:3307          0.0.0.0:*          LISTEN      2121/mysqld

### 关闭实例, 先不要操作哈
[root@localhost ~]# /usr/local/mysql/bin/mysqladmin -uroot -p -S /tmp/mysql_3306.sock shutdown
[root@localhost ~]# /usr/local/mysql/bin/mysqladmin -uroot -p -S /tmp/mysql_3307.sock shutdown
# 注意:这里mysql的root用户并没有设置密码,密码提示直接敲 Enter即可
OK, 我们看到mysqld 监听在3306,3307两个端口上。

这里,我们也可以提供一个服务启动脚本来进行管理,大家去看看support-files/mysql.server这个服务启动脚本吧。

下面提供一个脚本模板:(大家根据需求更改)
#!/bin/bash

. /etc/init.d/functions

PORT=$2

USER=root
PASSWD=

MYSQLBIN='/usr/local/mysql/bin'
SOCKETFILE="/tmp/mysql_${PORT}.sock"
PIDFILE="/mydata/data/${PORT}/mysql.pid"
MYCNF="/mydata/data/${PORT}/my.cnf"

[[ $# -eq 2 ]] || {
 echo "Usage: $0 {start|stop|restart|reload}  {PORT}"
 exit 1
}


mysql_start() {
 [[ -e "$SOCKETFILE" ]] && {
  action "MySQL port: $PORT IS already running" /bin/false
  exit 0
 } || {
  action "Starting MySQL...  please wait" /bin/true
  $MYSQLBIN/mysqld_safe --defaults-file=$MYCNF &> /dev/null &
 }

 [[ "$?" == "0" ]] && {
  action "MySQL has been Started" /bin/true
 } || {
  action "MySQL Started" /bin/false
 }
}


mysql_stop() {
 [[ ! -e "$SOCKETFILE" ]] && {
  action "MySQL port:$PORT was already down" /bin/false
 } || {
  $MYSQLBIN/mysqladmin -u $USER -p$PASSWD -S $SOCKETFILE shutdown &>/dev/null
 }
 [[ "$?" == 0 ]] && {
  action  "MySQL port:$PORT has been Stopped" /bin/true
 }
}

case "$1" in
'start')
 mysql_start
 ;;
'stop')
 mysql_stop
 ;;
'restart'|'reload')
 mysql_stop
 sleep 3
 mysql_start
 ;;
*)
 echo "Usage: $0 {start|stop|restart|reload}  {PORT}"
esac

 

9、测试连接登录实例

### 我们需要指定通过哪一个套接字进行连接
#  注意:这里mysql的root用户并没有设置密码,所以可以直接登录

[root@localhost mysql]# /usr/local/mysql/bin/mysql -S /tmp/mysql_3306.sock
[root@localhost mysql]# /usr/local/mysql/bin/mysql -S /tmp/mysql_3307.sock

更多详情见请继续阅读下一页的精彩内容http://www.linuxidc.com/Linux/2014-07/104508p2.htm

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款