8 . 1 . 1 什 么 是 MYSQL 多 实 例 ?
简 单 的 说 , 就 是 在 一 台 机 器 上 开 启 多 个 不 同 的 服 务 端 口 ( 如 : 3306 , 3307 ) , 运 行 多 个 MySQL 服 务 进 程 , 这 些 服 务 进 程 通 过 不 同 的 socket 监 听 不 同 的 服 务 端 口 来 提 供 各 自 的 服务 。这 些 MySQL 多 实 例 共 用 一 套 NLvSQL 安 装 程 序 , 使 用 不 同 (可 以 相 同 ) 的 my.cnf 配 置 文 件 ,启 动 程 序 ,数 据 文 件 。 在 提 供 服 务 时 ,多 实 例 MySQL 在 逻 辑 上 看 来 是 各 自 独 立 的,多 个 实 例 的 自 身 是 根 据 配 置 文 件 对 应 的 设 定 值 , 来 取 得 服 务 器 的 相 关 硬 件 资 源 多 少 。
8 . 1 . 2 MYSQL 多 实 例 的 作 用 与 问 题
优势
(1).有 效 利 用 服 务 器 资 源
(2) 节 约 服 务 器 资 源 . .
当 公 司 资 金 紧 张 , 但 是 数 据 库 又 需 要 各 自 尽 量 独 立 提 供 服 务 , 而 且 , 需 要 主 从 同 步 等 技 术 时 , 多 实 例 就 再 好 不 过 了 。
问题:
(1)資 源 互 相 抢 占 问 题
当 某 个 服 务 实 例 并 发 很 高 或 者 有 慢 查 询 时 , 整 个 实 例 会 消 耗 更 多 的 内 存 、 CPU 、 磁 盘 资 源 , 导 致 服 务 器 上 的 其 它 的 实 例 提 供 服 务 的 质 量 下 降 : 这 就 相 当 于 大 家 住 在 一 个 房 于 的 不 同 卧 室 一 样 , 早 晨 起 来 上 班 , 都 要 刷 牙 、 洗 脸 等 , 这 样 卫 生 间 就 会 长 期 占 用 , 其 它 人 就 要 等 待 一 样 的 道 理 :
MYSQL 多 实 例 生 产 应 用 场 景 “
(1) 资 金 紧 张 型 公 司 的 选 择
当 公 司 业 务 访 司 量 不 太 大 , 又 舍 不 得 花 钱 , 但 又 希 望 不 同 业 务 的 数 据 库 服 务 各 自 尽 量 独 立 的 提 供 服 务 互 不 受 影 响 , 而 且 , 需 要 主 从 同 步 进 行 等 技 术 提 供 备 份 或 读 写 分 离 服 务 时 , 多 实 例 就 再 好 不 过 了 ; 如 . 可 以 通 过 3 台 服 务 器 部 署 6-9 个 实 例 , 交 叉 做 主 从 同 步 备 份 及 读 写 分 离 , 实 现 6-9 台 服 务 器 才 有 的 效 果 : 这 里 要 强 调 的 是 , 所 谓 的 尽 量 独 立 是 对
(2)并 发 访 问 不 是 特 别 大 的 业 务
当 公 司 业 务 访 问 量 不 太 大 的 时 候 , 菔 务 器 的 资 源 基 本 都 是 浪 费 的 , 这 时 就 很 适 合 多 个应 用 , 如 果 对 SQL 语 句 优 化 做 的 比 较 好 , MySQL 多 实 例 个 值 得 使 技 本 。
(3) 门 户 网 站 应 用 MySQL 多 实 例 场 景
百 度 搜 索 引 擎 的 数 据 库 就 是 多 实 例 , 一 般 是 从 库 ,48核, 内 存 96G , 跑 3-4 个 实 例 , Sina 网 也 是 用 的 多 实 例 , 内 存 48G 左 右 。 门 户 网 站 使 用 多 实 例 的 目 的 是 配 硬 件 好 的 服 务 器 , 节 省 IDC 机 柜 空 间 , 同 时 , 跑 多 实 例 让 硬 件 资 源 不 浪 费
(1)安装依赖mysql安装包
[root@mysql-multipath ~]# yum -y install ncurses-devel.x86_64
[root@mysql-multipath ~]# yum -y install libaio-devel
(2)添加用户,组
[root@mysql-multipath ~]# groupadd mysql
[root@mysql-multipath ~]# useradd -s /sbin/nologin -g mysql -M mysql
[root@mysql-multipath ~]# tail -l /etc/passwd
(3)上传文件
[root@mysql-multipath ~]# cd /u01/software/
[root@mysql-multipath software]# ls
cmake-2.8.8.tar.gz mysql-5.5.32.tar.gz rhel-server-6.6-x86_64-dvd.iso
(4)安装cmake
[root@mysql-multipath software]# tar xf cmake-2.8.8.tar.gz
[root@mysql-multipath software]# cd cmake-2.8.8
[root@mysql-multipath cmake-2.8.8]# ./configure
---------------------------------------------
-- Enable ninja generator.
-- Looking for a Fortran compiler
-- Looking for a Fortran compiler
-- Configuring done
-- Generating done
-- Build files have been written to: /u01/software/cmake-2.8.8
---------------------------------------------
CMake has bootstrapped. Now run gmake.
[root@mysql-multipath cmake-2.8.8]# make && make install
(5)安装mysql
[root@mysql-multipath software]# tar xf mysql-5.5.32.tar.gz
[root@mysql-multipath software]# cd mysql-5.5.32
[root@mysql-multipath mysql-5.5.32]# cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.5.32
\
> -DMYSQL_DATADIR=/application/mysql-5.5.32/data \
> -DMYSQL_UNIX_ADDR=/application/mysql-5.5.32/tmp/mysql.sock \
> -DDEFAULT_CHARSET=utf8 \
> -DDEFAULT_COLLATION=utf8_general_ci \
> -DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \
> -DENABLED_LOCAL_INFILE=ON \
> -DWITH_INNOBASE_STORAGE_ENGINE=1 \
> -DWITH_FEDERATED_STORAGE_ENGINE=1 \
> -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
> -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
> -DWITHOUT_PARTITION_STORAGE_ENGINE=1 \
> -DWITH_FAST_MUTEXES=1 \
> -DWITH_ZLIB=bundled \
> -DENABLED_LOCAL_INFILE=1 \
> -DWITH_READLINE=1 \
> -DWITH_EMBEDDED_SERVER=1 \
> -DWITH_DEBUG=0
[root@mysql-multipath mysql-5.5.32]# make && make install
(6)生成不带版本的软件链接/application/mysql 即mysql安装路径
[root@mysql-multipath mysql-5.5.32]# ln -s /application/mysql-5.5.32/ /application/mysql
(7)创建路径并授予权限
[root@mysql-multipath mysql-5.5.32]# mkdir -p /data/{3306,3307}/data
[root@mysql-multipath 3306]# ls
data my.cnf mysql
[root@mysql-multipath 3307]# ls
data my.cnf mysql
[root@mysql-multipath data]# ls
3306 3307
[root@mysql-multipath data]# cd 3306
[root@mysql-multipath 3306]# ls
data my.cnf mysql
[root@mysql-multipath 3306]# chown -R mysql.mysql /data
[root@mysql-multipath 3306]# ll
total 12
drwxr-xr-x. 2 mysql mysql 4096 Dec 29 14:37 data
-rw-r--r--. 1 mysql mysql 1899 Dec 29 14:34 my.cnf
-rw-r--r--. 1 mysql mysql 1311 Dec 29 14:40 mysql
[root@mysql-multipath 3306]# ls
data my.cnf mysql
[root@mysql-multipath 3306]# chmod +x mysql
[root@mysql-multipath 3307]# chmod +x mysql
(8)设置环境变量
[root@mysql-multipath 3307]# echo 'export PATH=/application/mysql/bin:$PATH' >>/etc/profile
[root@mysql-multipath 3307]# tail -l /etc/profile
. "$i"
else
. "$i" >/dev/null 2>&1
fi
fi
done
unset i
unset -f pathmunge
export PATH=/application/mysql/bin:$PATH
[root@mysql-multipath 3307]# source /etc/profile
(9)初始化数据库
[root@mysql-multipath 3307]# cd /application/mysql/scripts/
[root@mysql-multipath scripts]# ./mysql_install_db --basedir=/application/mysql --datadir=/data/3306/data/ --user=mysql
Installing MySQL system tables...
OK
Filling help tables...
OK
[root@mysql-multipath scripts]# ./mysql_install_db --basedir=/application/mysql --datadir=/data/3307/data/ --user=mysql
Installing MySQL system tables...
OK
Filling help tables...
OK
(10)启动数据库
[root@mysql-multipath scripts]# /data/3306/mysql start
Starting MySQL...
[root@mysql-multipath scripts]# /data/3307/mysql start
Starting MySQL...
[root@mysql-multipath scripts]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 78354 mysql 12u IPv4 150857 0t0 TCP *:mysql (LISTEN)
[root@mysql-multipath scripts]# lsof -i:3307
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 79073 mysql 11u IPv4 151360 0t0 TCP *:opsession-prxy (LISTEN)
(11)登录数据库(/data/3306/mysql的脚本中start是不需要密码的,但是stop需要密码)
[root@mysql-multipath 3306]# mysql -S /data/3306/mysql.sock
[root@mysql-multipath 3306]# mysql -S /data/3307/mysql.sock
mysql> system ls(system后面可以直接执行操作系统的命令)
data mysql mysql-bin.index mysql_oldboy3306.err
my.cnf mysql-bin.000001 mysql.sock mysqld.pid
mysql> system mysql -S /data/3306/mysql.sock
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.32-log Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| d3306 |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> exit
Bye
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| d3307 |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> exit
Bye
[root@mysql-multipath 3307]# /data/3307/mysql stop(/data/3306(3307)/mysql这个脚本中的start不需要密码,但是stop需要密码,所以当你stop的时候会报错)
Stoping MySQL...
Enter password:
/application/mysql/bin/mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'root'@'localhost' (using password: YES)'
[root@mysql-multipath 3307]# vi mysql 可以先将里面的密码清空就可以关闭了,就不会错
"mysql" 61L, 1311C#!/bin/sh
################################################
#this scripts is created by oldboy at 2007-06-09
#oldboy QQ:31333741
#site:http://www.etiantian.org
#blog:http://oldboy.blog.51cto.com
#oldboy trainning QQ group: 208160987 226199307 44246017
################################################
#init
port=3307
mysql_user="root"
mysql_pwd="Root123!@#"
CmdPath="/application/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
#startup function
function_start_mysql()
{
if [ ! -e "$mysql_sock" ];thenprintf "Starting MySQL...\n"/bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &
elseprintf "MySQL is running...\n"exit
fi
}
(12)设置密码,必须在数据库开启的情况下
[root@mysql-multipath 3307]# mysqladmin -u root -S /data/3307/mysql.sock password 'Root123!@#'
修改过密码后,要将修改后的密码放入到mysql中,否者登录时后报错
[root@mysql-multipath 3307]# mysqladmin -u root -S /data/3307/mysql.sock password 'Root123!@#'
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[root@mysql-multipath 3307]# vi mysql
"mysql" 61L, 1301C#!/bin/sh
################################################
#this scripts is created by oldboy at 2007-06-09
#oldboy QQ:31333741
#site:http://www.etiantian.org
#blog:http://oldboy.blog.51cto.com
#oldboy trainning QQ group: 208160987 226199307 44246017
################################################
#init
port=3307
mysql_user="root"
mysql_pwd="Root123!@#"
CmdPath="/application/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
#startup function
function_start_mysql()
{
if [ ! -e "$mysql_sock" ];thenprintf "Starting MySQL...\n"/bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &
elseprintf "MySQL is running...\n"exit
fi
}
[root@mysql-multipath 3307】mysqladmin -u root -S /data/3307/mysql.sock password 'Root123!@#' 就不会报错了
[root@mysql-multipath 3306]# chmod 700 mysql
[root@mysql-multipath 3306]# cd ../3307
[root@mysql-multipath 3307]# ls
data my.cnf mysql mysql.sock mysql_oldboy3307.err mysqld.pid
[root@mysql-multipath 3307]# chmod 700 mysql
[root@mysql-multipath 3307]# chown root.root mysql
[root@mysql-multipath 3307]# cd ../3306
[root@mysql-multipath 330own root.root
[root@mysql-multipath 3306]# pkill mysqld
[root@mysql-multipath 3306]# pkill mysqld
[root@mysql-multipath 3306]# lsof -i:3306
[root@mysql-multipath 3306]# lsof -i:3307
[root@mysql-multipath 3306]# /data/3306/mysql start
Starting MySQL...
[root@mysql-multipath 3306]# /data/3307
Starting MySQL...
[root@mysql-multipath 3306]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 80706 mysql 12u IPv4 156636 0t0 TCP *:mysql (LISTEN)
[root@mysql-multipath 3306]# lsof -i:337
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 81424 mysql 11u IPv4 157130 0t0 TCP *:opsession-prxy (LISTEN)
[root@mysql-multipath 3306]# mysql -uroot -p -S /data/3306/mysql.sock
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.32-log Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> system mysql -uroot -p -S /data/3307/mysql.sock
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.32 Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select user,host from mysql.user;
+------+-----------------+
| user | host |
+------+-----------------+
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| root | localhost |
| | mysql-multipath |
| root | mysql-multipath |
+------+-----------------+
6 rows in set (0.00 sec)
mysql> delete from mysql.user where user="";
Query OK, 2 rows affected (0.00 sec)
mysql> delete from mysql.user where user="";
mysql> select user,host from mysql.user;
+------+-----------------+
| user | host |
+------+-----------------+
| root | 127.0.0.1 |
| root | ::1 |
| root | localhost |
| root | mysql-multipath |
+------+-----------------+
4 rows in set (0.01 sec)
mysql> select user,host from mysql.user;
mysql> delete from mysql.user where user="::1
Query OK, 0 rows affected (0.01 sec)
mysql> delete from mysql.user where user="::1";
+------+-----------------+
| user | host |
+------+-----------------+
| root | 127.0.0.1 |
| root | ::1 |
| root | localhost |
| root | mysql-multipath |
+------+-----------------+
4 rows in set (0.01 sec)
mysql> select user,host from mysql.user;
mysql> delete from mysql.user where host="::1
Query OK, 1 row affected (0.01 sec)
mysql> delete from mysql.user where host="::1";
mysql> select user,host from mysql.user;
+------+-----------------+
| user | host |
+------+-----------------+
| root | 127.0.0.1 |
| root | localhost |
| root | mysql-multipath |
+------+-----------------+
3 rows in set (0.01 sec)
mysql> select user,host from mysql.user;
mysql> delete from mysql.user where host="::1"
Bye
mysql> select user,host from mysql.user;
+------+-----------------+
| user | host |
+------+-----------------+
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| root | localhost |
| | mysql-multipath |
| root | mysql-multipath |
+------+-----------------+
6 rows in set (0.00 sec)
mysql> delete from mysql.user where host=
-> "::1";
Query OK, 1 row affected (0.00 sec)
mysql> delete from mysql.user where user="";
Query OK, 2 rows affected (0.00 sec)
mysql> delete from mysql.user where host= "::1";
mysql> delete from mysql.user where host=
mysql> select user,host from mysql.user;
+------+-----------------+
| user | host |
+------+-----------------+
| root | 127.0.0.1 |
| root | localhost |
| root | mysql-multipath |
+------+-----------------+
3 rows in set (0.00 sec)
mysql> exit
Bye
新添加一个实例3308
[root@mysql-multipath data]# mkdir -p /data/3308/data
[root@mysql-multipath data]# cd 3307
[root@mysql-multipath 3307]# ls
data my.cnf mysql mysql.sock mysql_oldboy3307.err mysqld.pid
[root@mysql-multipath 3307]# cp my.cnf ../3308/
[root@mysql-multipath 3307]# cp mysql
[root@mysql-multipath 3307]# cd ../3308
[root@mysql-multipath 3308]# ls
data my.cnf mysql
[root@mysql-multipath 3308]# chown -R mysql.mysql /data/3308
[root@mysql-multipath 3308]# ls
data my.cnf mysql
修改my.cnf和mysql中的port和server_id
[root@mysql-multipath 3308]# vi my.cnf
[root@mysql-multipath 3308]# vi mysql
"mysql" 61L, 1311C#!/bin/sh
################################################
#this scripts is created by oldboy at 2007-06-09
#oldboy QQ:31333741
#site:http://www.etiantian.org
#blog:http://oldboy.blog.51cto.com
#oldboy trainning QQ group: 208160987 226199307 44246017
################################################
#init
port=3307
mysql_user="root"
mysql_pwd="Root123!@#"
CmdPath="/application/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
#startup function
function_start_mysql()
{
if [ ! -e "$mysql_sock" ];thenprintf "Starting MySQL...\n"/bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &
elseprintf "MySQL is running...\n"exit
fi
}
port=330:wq
"mysql" 61L, 1311C written
[root@mysql-multipath 3308]# ./mysql_install_db --basedir=/application/mysql --datadir=/data/330
7
8
-bash: ./mysql_install_db: No such file or directory
[root@mysql-multipath 3308]# cd /application/mysql/scripts/
[root@mysql-multipath scripts]# ./mysql_install_db --basedir=/application/mysql --datadir=/data/3
3308/data/ --user=mysql
Installing MySQL system tables...
OK
Filling help tables...
OK
[root@mysql-multipath scripts]# /data/3308/mysql start
Starting MySQL...
[root@mysql-multipath scripts]# lsof -i:3308
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 82279 mysql 11u IPv4 159803 0t0 TCP *:tns-server (LISTEN)
[root@mysql-multipath scripts]# mysqladmin -u root -S /data/3308/mysql.sock password 'Root123!@#'
[root@mysql-multipath scripts]# mysql -uroot -p -S /data/3308
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.32 Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
[root@mysql-multipath scripts]# cd /data/3308
[root@mysql-multipath 3308]# ls
data my.cnf mysql mysql.sock mysql_oldboy3308.err mysqld.pid
[root@mysql-multipath 3308]# vi mysql
"mysql" 61L, 1311C#!/bin/sh
################################################
#this scripts is created by oldboy at 2007-06-09
#oldboy QQ:31333741
#site:http://www.etiantian.org
#blog:http://oldboy.blog.51cto.com
#oldboy trainning QQ group: 208160987 226199307 44246017
################################################
#init
port=3308
mysql_user="root"
mysql_pwd="Root123!@#"
CmdPath="/application/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
#startup function
function_start_mysql()
{
if [ ! -e "$mysql_sock" ];thenprintf "Starting MySQL...\n"/bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &
elseprintf "MySQL is running...\n"exit
fi
}