深入解析Mysql 主从同步延迟原理及解决方案

分类:技术文档 - MySQL | 阅读(1677) | 发布于:2018-04-23 18:54 | 标签: 主从同步 主从延迟 mysql

MySQL的主从同步是一个很成熟的架构,优点为:①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;②在从主服务器进行备份,避免备份期间影响主服务器服务;③当主服务器出现问题时,可以切换到从服务器。

相信大家对于这些好处已经非常了解了,在项目的部署中也采用这种方案。但是MySQL的主从同步一直有从库延迟的问题,那么为什么会有这种问题。这种问题如何解决呢?

1. MySQL数据库主从同步延迟原理。

2. MySQL数据库主从同步延迟是怎么产生的。

3. MySQL数据库主从同步延迟解决方案。

1. MySQL数据库主从同步延迟原理。

答:谈到MySQL数据库主从同步延迟原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作,主库对所有DDL和 DML产生binlog,binlog是顺序写,所以效率很高,slave的Slave_IO_Running线程到主库取日志,效率很比较高,下一步, 问题来了,slave的Slave_SQL_Running线程将主库的DDL和DML操作在slave实施。DML和DDL的IO操作是随即的,不是顺 序的,成本高很多,还可能可slave上的其他查询产生lock争用,由于Slave_SQL_Running也是单线程的,所以一个DDL卡主了,需要 执行10分钟,那么所有之后的DDL会等待这个DDL执行完才会继续执行,这就导致了延时。有朋友会问:“主库上那个相同的DDL也需要执行10分,为什 么slave会延时?”,答案是master可以并发,Slave_SQL_Running线程却不可以。

2. MySQL数据库主从同步延迟是怎么产生的。

答:当主库的TPS并发较高时,产生的DDL数量超过slave一个sql线程所能承受的范围,那么延时就产生了,当然还有就是可能与slave的大型query语句产生了锁等待。

3. MySQL数据库主从同步延迟解决方案

答:最简单的减少slave同步延时的方案就是在架构上做优化,尽量让主库的DDL快速执行。还有就是主库是写,对数据安全性较高,比如 sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之类的设置,而slave则不需要这么高的数据安全,完全可以讲sync_binlog设置为0或者关闭binlog,innodb_flushlog也 可以设置为0来提高sql的执行效率。另外就是使用比主库更好的硬件设备作为slave。

mysql-5.6.3已经支持了多线程的主从复制。原理类似,是以表做多线程,Oracle使用的是以数据库(schema)为单位做多线程,不同的库可以使用不同的复制线程。

sync_binlog=1

This makes MySQL synchronize the binary log’s contents to disk each time it commits a transaction

默认情况下,并不是每次写入时都将binlog与硬盘同步。因此如果操作系统或机器(不仅仅是MySQL服务器)崩溃,有可能binlog中最后的语句丢 失了。要想防止这种情况,你可以使用sync_binlog全局变量(1是最安全的值,但也是最慢的),使binlog在每N次binlog写入后与硬盘 同步。即使sync_binlog设置为1,出现崩溃时,也有可能表内容和binlog内容之间存在不一致性。如果使用InnoDB表,MySQL服务器 处理COMMIT语句,它将整个事务写入binlog并将事务提交到InnoDB中。如果在两次操作之间出现崩溃,重启时,事务被InnoDB回滚,但仍 然存在binlog中。可以用--innodb-safe-binlog选项来增加InnoDB表内容和binlog之间的一致性。(注释:在MySQL 5.1中不需要--innodb-safe-binlog;由于引入了XA事务支持,该选项作废了),该选项可以提供更大程度的安全,使每个事务的 binlog(sync_binlog =1)和(默认情况为真)InnoDB日志与硬盘同步,该选项的效果是崩溃后重启时,在滚回事务后,MySQL服务器从binlog剪切回滚的 InnoDB事务。这样可以确保binlog反馈InnoDB表的确切数据等,并使从服务器保持与主服务器保持同步(不接收 回滚的语句)。

附加:
sync_binlog 配置说明:
sync_binlog”:这个参数是对于MySQL系统来说是至关重要的,他不仅影响到Binlog对MySQL所带来的性能损耗,而且还影响到MySQL中数据的完整性。对于“sync_binlog”参数的各种设置的说明如下:
sync_binlog=0,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。
sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。
在MySQL中系统默认的设置是sync_binlog=0,也就是不做任何强制性的磁盘刷新指令,这时候的性能是最好的,但是风险也是最大的。因为一旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。而当设置为“1”的时候,是最安全但是性能损耗最大的设置。因为当设置为1的时候,即使系统Crash,也最多丢失binlog_cache中未完成的一个事务,对实际数据没有任何实质性影响。
从以往经验和相关测试来看,对于高并发事务的系统来说,“sync_binlog”设置为0和设置为1的系统写入性能差距可能高达5倍甚至更多。

innodb_flush_log_at_trx_commit (这个很管用)

抱怨Innodb比MyISAM慢 100倍?那么你大概是忘了调整这个值。默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。特别是使用电 池供电缓存(Battery backed up cache)时。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬 盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统 挂了时才可能丢数据。

阅读更多...

Confluence系统迁移安装

分类:技术文档 - Linux | 阅读(1632) | 发布于:2018-01-24 15:59 | 标签: confluence

前置:
confluence是由java的tomcate启动运行的。所以请先配置java jdk环境。
默认端口8090也需提前预留出来。

一、下载解压文件

cd /usr/local/src/

wget -c ftp://192.168.48.225/soft/atlassian-confluence-6.3.2.tar.gz

tar zxvf atlassian-confluence-6.3.2.tar.gz

mv atlassian-confluence-6.3.2 /usr/local/

cd /usr/local/

ln -s atlassian-confluence-6.3.2/ confluence

cd confluence/


二、拷贝mysql链接驱动文件到服务器

cp  mysql-connector-java-5.1.43-bin.jar  /usr/local/confluence/confluence/WEB-INF/lib/


三、配置confluence的数据目录

cd /usr/local/confluence/confluence/WEB-INF/classes/

修改confluence.home的配置

vim confluence-init.properties

confluence.home=/usr/local/confluence/confluence_home

创建confluence的数据目录

mkdir /usr/local/confluence/confluence_home

说明:confluence程序是分安装目录和数据目录的。一般指定数据目录位置,以便后续迁移或恢复程序。


四、启动confluence程序

cd /usr/local/confluence

./bin/start-confluence.sh


五、打开浏览器配置安装

浏览器打开地址:http://192.168.48.224:8090

1。选择默认语言及安装方式 product install

2。插件(直接下一步吧)

3。授权码:打开链接 获得试用授权 后,先注册my.atlassian.com的账户(注册需要用到google的图片验证码,请翻墙打开页面),然后获取免费的授权码,并填入。如果之前选择了插件的,也需申请插件的授权码。

4。选择数据库设置 : 外部数据库-Mysql

5。配置数据库 :
            JDBC连接

            填入     类驱动名称 /数据库URL / 用户名  / 密码

            数据库URL值: jdbc:mysql://192.168.48.225/confluence?useUnicode=true&characterEncoding=utf8&sessionVariables=tx_isolation='READ-COMMITTED'

                          说明: 请先创建该数据库 :CREATE DATABASE `confluence` CHARACTER SET utf8 COLLATE utf8_bin; 老的字符集就是这个utf8_bin

                                     支持中文:useUnicode=true&characterEncoding=utf8

                                     mysql设置隔离级别READ-COMMITTED :sessionVariables=tx_isolation='READ-COMMITTED'

6。加载内容  

         选择 空白站点 或 备份导入 的方式

         此处选择 备份导入的方式继续。备份导入的文件是由之前的系统备份数据而来的ZIP文件包。

         备份文件必须复制至/usr/local/atlassian-confluence-6.3.2/confluence_home/restore目录中

         选择还原

7。等。继续等。

8。完成安装。


六、配置反向代理访问

默认tomcate启动的是8090端口。当然,这个也可以改。

此处使用nginx反向代理绑定域名来访问,具体nginx代理配置:

server {
    listen 80;
    server_name wiki.ggt.sina.com.cn;

    location / {
        internal;
        proxy_pass http://127.0.0.1:8090;
        proxy_connect_timeout 30s;
        proxy_send_timeout 120;
        proxy_read_timeout 120;
        proxy_buffer_size 32k;
        proxy_buffers 4 32k;
        proxy_busy_buffers_size 64k;
        proxy_redirect off;
        proxy_hide_header Vary;
        proxy_set_header Accept-Encoding '';
        proxy_set_header Host $host;
        proxy_set_header Referer $http_referer;
        proxy_set_header Cookie $http_cookie;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

阅读更多...

Ubuntu16.04 root用户登录没有声音的解决方法

分类:技术文档 - Linux | 阅读(1847) | 发布于:2017-11-30 13:03 | 标签: 声音

Ubuntu16.04 root用户登录没有声音的解决方法  

备注:
1)Ubuntu Desktop版本:16.04
2)Linux工作用户:root

1. 临时方法
在终端中执行命令:
pulseaudio --start --log-target=syslog

2. 永久方法
将上面的命令添加到用户启动脚本中:
pulseaudio --start --log-target=syslog

阅读更多...

PHP使用变量引用实现先使用后赋值

分类:技术文档 - PHP文档 | 阅读(1718) | 发布于:2017-07-11 17:26 | 标签:无

一般情况下,变量需要先赋值再使用,但是在一些另类的情形下,需要先使用后来赋值,
例如下面:
<?php
class test
{
	public function run()
	{
		
		//uid初始化
		$uid = 0;
		
		//uid使用
		$user = [];
		$user['detail'] = $this->get_user_detail($uid);
		$user['employment'] = $this->get_user_employment($uid);
		
		//uid赋值
		$uid = 123456;
		
		print_r($user);
	}
	
	private function get_user_detail(&$uid){
		return [
			'uid'=>&$uid,
			'name'=>'zhangsan',
			'sex'=>'male',
		];
	}
	
	private function get_user_employment(&$uid){
		return [
			'uid'=>&$uid,
			'company_name'=>'ggt',
			'tel'=>'010-87654321',
		];
	}

}

$test = new test();
$test -> run();
运行后显示:
Array
(
    [detail] => Array
        (
            [uid] => 123456
            [name] => zhangsan
            [sex] => male
        )

    [employment] => Array
        (
            [uid] => 123456
            [company_name] => ggt
            [tel] => 010-87654321
        )

)

阅读更多...

ubuntu14.04 ssh允许root用户远程登录

分类:技术文档 - Linux | 阅读(1864) | 发布于:2017-06-19 13:45 | 标签: ssh

1.修改 root 密码
sudo passwd root

2. 以其他账户登录,通过 sudo nano 修改 /etc/ssh/sshd_config :
su - root
vi /etc/ssh/sshd_config

3. 注释掉 #PermitRootLogin without-password,添加 PermitRootLogin yes
#PermitRootLogin without-password
PermitRootLogin yes

4. 重启 ssh  服务
service ssh restart

阅读更多...

HTTPS的工作原理

分类:技术文档 - PHP文档 | 阅读(3511) | 发布于:2017-05-18 10:18 | 标签: HTTPS

HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL协议不仅仅是一套加密传输的协议,更是一件经过艺术家精心设计的艺术品,TLS/SSL中使用了非对称加密,对称加密以及HASH算法。握手过程的简单描述如下:

1.浏览器将自己支持的一套加密规则发送给网站。

2.网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。

3.获得网站证书之后浏览器要做以下工作:

a) 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。

b) 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。

c) 使用约定好的HASH计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。

4.网站接收浏览器发来的数据之后要做以下的操作:

a) 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。

b) 使用密码加密一段握手消息,发送给浏览器。

5.浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
这里浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。另外,HTTPS一般使用的加密与HASH算法如下:

非对称加密算法:RSA,DSA/DSS
对称加密算法:AES,RC4,3DES
HASH算法:MD5,SHA1,SHA256

其中非对称加密算法用于在握手过程中加密生成的密码,对称加密算法用于对真正传输的数据进行加密,而HASH算法用于验证数据的完整性。由于浏览器生成的密码是整个数据加密的关键,因此在传输的时候使用了非对称加密算法对其加密。非对称加密算法会生成公钥和私钥,公钥只能用于加密数据,因此可以随意传输,而网站的私钥用于对数据进行解密,所以网站都会非常小心的保管自己的私钥,防止泄漏。

TLS握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输。正是由于HTTPS非常的安全,攻击者无法从中找到下手的地方,于是更多的是采用了假证书的手法来欺骗客户端,从而获取明文的信息,但是这些手段都可以被识别出来,我将在后续的文章进行讲述。

阅读更多...

nginx 视频直播/点播服务

分类:技术文档 - Linux | 阅读(4239) | 发布于:2017-04-19 17:04 | 标签: nginx 直播 点播 rtmp

近年互联网直播业务非常火热。工作之余也研究了下,发现nginx上配置视频直播点播也很容易实现,特分享如下。

一、ubuntu14.04安装nginx及nginx_rtmp_module扩展
nginx根据是否已安装和安装的方式不同,有一下三种方式安装及扩展安装。

1.全新安装nginx和nginx_rtmp_module扩展

#!/bin/sh

apt-get update
apt-get install -y gcc libpcre3 libpcre3-dev openssl libssl-dev make git libxml2 libxml2-dev libxslt-dev libgd2-xpm-dev geoip-database libgeoip-dev
cd /usr/local/src/
git clone https://github.com/arut/nginx-rtmp-module.git
wget -c  http://mirrors.sohu.com/nginx/nginx-1.9.14.tar.gz
tar zxvf nginx-1.9.14.tar.gz
cd nginx-1.9.14/
./configure --with-http_ssl_module --add-module=/usr/local/src/nginx-rtmp-module
make 
make install
cd /usr/local/nginx/
ln -s `pwd`/sbin/nginx /usr/sbin/nginx

nginx -V

wget http://www.lixiaocheng.com/editor/attached/file/20160322/20160322112243_43972.txt
mv 20160322112243_43972.txt /etc/init.d/nginx
chmod +x /etc/init.d/nginx
service nginx restart

2.apt-get安装过nginx的,需重新编译安装并添加nginx_rtmp_module扩展

#!/bin/sh
apt-get -y install dpkg-dev libxml2 libxml2-dev libxslt-dev libgd2-xpm-dev geoip-database libgeoip-dev libpcre3 libpcre3-dev libssl-dev  openssl 

nginx -V 2>a 
nginx_config=`cat a |grep configure | cut -d ':' -f 2`
nginx_version=`cat a|grep 'nginx version'|cut -d '/' -f 2 | cut -d ' ' -f 1`
rm -f a

cd /usr/local/src/

# apt-get install -y git
git clone https://github.com/arut/nginx-rtmp-module.git

#官网下载对应的nginx版本
# apt-get source nginx
wget -c "http://nginx.org/download/nginx-${nginx_version}.tar.gz"
tar zxvf "nginx-${nginx_version}.tar.gz"
cd "nginx-$nginx_version"
echo "./configure ${nginx_config} --add-module=/usr/local/src/nginx-rtmp-module" | sh
make

#强制覆盖
cp -rfp objs/nginx /usr/sbin/nginx
#检查是否错误
/usr/sbin/nginx -t
#重启nginx
service nginx restart
nginx -V

3.已经编译安装过nginx的,可以直接添加nginx_rtmp_module扩展

找到安装nginx的源码根目录,如果没有的话下载新的源码
我的安装源码根目录 /usr/local/src/nginx-1.4.6

cd /usr/local/src/
# apt-get install -y git
git clone https://github.com/arut/nginx-rtmp-module.git

nginx -V 2>a 
nginx_config=`cat a |grep configure | cut -d ':' -f 2`
rm -f a

cd nginx-1.4.6
echo "./configure ${nginx_config} --add-module=/usr/local/src/nginx-rtmp-module" | sh
make

#强制覆盖
cp -rfp objs/nginx /usr/sbin/nginx
#检查是否错误
/usr/sbin/nginx -t
#重启nginx
service nginx restart
nginx -V


二、配置使用

编辑nginx的配置文件(/etc/nginx/nginx.conf或/usr/local/nginx/conf/nginx.conf)
1.在http节点外层添加一个rtmp节点,具体内容如下:

rtmp {
	server {
		listen 1935;
		chunk_size 4096;
		max_connections 100;

		#音视频流上传和播放地址都是 rtmp://你的IP/live/streamName 
		#streamName自己是自定义的。
		application live {
			live on;
			record off;
		}

		#这个是上传地址 rtmp://你的IP:/hls/streamName2
		#直播的地址也是这个,点播播放地址在下面
		application hls {
			live on;
			hls on;
			#请先创建相应目录(mkdir -p /var/www/hls/ && chown -R www-data:www-data /var/www )
			hls_path /var/www/hls/;
		}
	}
}

说明:
application 表示一个应用
地址后面的streamName可以自己定义,点播时会在相应目录下生成类似 streamName.m3u8 和 streamName.ts 的文件。
live on; 表示打开直播。
hls on; 表示打开点播,会在服务器上生成临时文件的。
record off; 是关闭保存视频的功能。
点播播放的地址是一个http协议的数据流地址。例如下面配置的 http://你的IP:8080/hls/streamName2.m3u8 。
点播的文件默认是逐个生成的,又会逐个自动删除。m3u8文件是一个动态的。用vim可以查看。

2.在下面的http节点内部添加一个server节点,具体内容如下:

#这个是点播播放地址 http://你的IP:8080/hls/streamName2.m3u8
server {
		listen      8080;
		index index.html;
		root  /var/www/hls/;

		location /hls {
				alias /var/www/hls/;
				types {
						application/vnd.apple.mpegurl m3u8;
						video/mp2t ts;
				}
				add_header Cache-Control no-cache;
		}
}
说明:
这个节点是配置的一个虚拟主机,目的是为了播放上面点播服务生成的视频流。
url中streamName2是根据录制推流的名字来的。需要保持一致。

默认下,该地址有一定的时限行,需要每次都先确认一下,服务器上是否存在该m3u8文件。

3.测试使用

    a.推视频流到服务器

        (1).使用linux上ffmpeg工具模拟推流到服务器

        安装ffmpeg工具

apt-get -y install build-essential git-core checkinstall yasm texi2html libvorbis-dev libx11-dev libvpx-dev libxfixes-dev zlib1g-dev pkg-config netcat libncurses5-dev libfaac-dev  libmp3lame-dev libx264-dev

FFMPEG_VERSION=2.3.3

cd /usr/local/src
if [ ! -d "/usr/local/src/ffmpeg-${FFMPEG_VERSION}" ]; then
  sudo wget "http://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.bz2"
  sudo tar -xjf "ffmpeg-${FFMPEG_VERSION}.tar.bz2"
fi

cd "ffmpeg-${FFMPEG_VERSION}"
./configure --enable-version3 --enable-postproc --enable-libvorbis --enable-libvpx --enable-gpl --enable-nonfree --enable-pthreads --enable-libfaac --enable-libmp3lame --enable-libx264
make
checkinstall --pkgname=ffmpeg --pkgversion="5:${FFMPEG_VERSION}" --backup=no --deldoc=yes --default

ffmpeg –version

使用ffmpeg工具把本地的视频文件模拟推送到服务器

ffmpeg -re -i /data/localFile.mp4 -c copy -f flv rtmp://你的IP/live/streamName
这个命令会把本地的localFile.mp4模拟推入live直播流,然后可以通过 rtmp://你的IP/live/streamName地址观看该直播。
ffmpeg -re -i /data/localFile.mp4 -c copy -f flv /var/www/hls/streamName
这个命令会把本地的localFile.mp4模拟推入到hls应用中,然后可以通过rtmp://你的IP/hls/streamName 地址观看该直播,也可以通过播放器打开http://你的IP:8080/hls/streamName.m3u8查看该视频的点播

        (2).Windows上使用一些专业工具推流到服务器

我是使用 锐动PC录制/直播SDK(http://www.rdsdk.com/contrast/pc3.html)[非打广告]包中的demo来推流的,这个可以免费使用且免安装。
网上推荐的常见推流测试工具有 OBS, XSplit, FMLE 等。
推流的地址是 rtmp://你的IP/hls/streamName 或者 rtmp://你的IP/live/streamName

        (3).自己编写手机等设备的APP,录制手机摄像头捕捉到的头像及麦克风捕捉到的声音,一起推送到服务器。

这类安卓或IOS的SDK也比较多。可自行开发。

    b.使用播放器点播播放视频

Windows和linux桌面版都可以是VLC播放器打开 http://你的IP:8080/hls/streamName.m3u8这个地址观看直播(这个播放器不支持rtmp直播播放?)

    c.使用Web浏览器在网页上播放直播视频

编写HTML页面index.html:

<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="content-type" content="text/html; charset=utf-8">
		<title>HLS Player</title>
	</head>
	<body>
	<video poster="poster.png" height="720" width="1280" controls>
		<source src="http://你的IP/hls/streamName.m3u8" type="application/vnd.apple.mpegurl" />
		<p class="warning">Your browser does not support HTML5 video.</p>
	</video>
	</body>
</html>
修改IP,保存页面至/var/www/hls/index.html中。
用苹果设备访问http://你的IP:8080/index.html就可以看到该直播了。
由于H5兼容性问题,只能在苹果设备上用浏览器访问。
如果想要其他设备都能访问需做兼容处理。一般用flash嵌入网页中去播放直播(rtmp://...)或点播(http://...xxx.m3u8)

    d.使用nginx_rtmp_module扩展包内文件来同时录制和直播测试

在nginx_rtmp_module扩展包内有测试文件,复制该文件夹内的文件到站点根目录(如/var/www/html)
cp -r /usr/local/src/nginx-rtmp-module/test/www/* /var/www/html;
修改index.html文件中rtmp的地址为 rtmp://你的IP/live/streamName
修改record.html文件中flashvars的streamer为 rtmp://你的IP/live 并改flashvars的file值为streamName
保存。

使用浏览器同时打开两个页面 :
    http://你的IP:8080/index.html(这个是直播观看的地址)
    http://你的IP:8080/record.html(这个是直播录像的地址,采用的是flash录制电脑的摄像头[请点击允许])


三、其他

1.nginx-rtmp-module的配置请看Wiki https://github.com/arut/nginx-rtmp-module/wiki/Control-module
2.以上环境只是测试学习使用。公网上必须考虑权限安全,网络带宽,视频质量等。
3.此类产品网络上也比较多,例如阿里云基础服务中就有视频直播点播的功能。


阅读更多...

PHP RSA 非对称加密解密实例

分类:技术文档 - PHP文档 | 阅读(3999) | 发布于:2017-04-07 15:37 | 标签: 加密 解密 非对称加密 rsa

PHP服务端与客户端交互、提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密


1、加密解密的第一步是生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以)

下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令:

#1.生成原始 RSA私钥文件 rsa_private_key.pem
openssl genrsa -out rsa_private_key.pem 1024
#2.将原始 RSA私钥转换为 pkcs8格式
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
#3.生成RSA公钥 rsa_public_key.pem
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

从上面看出通过私钥能生成对应的公钥,因此我们将私钥private_key.pem用在服务器端,公钥发放给Android跟iOS等前端


2、php中用生成的公钥、私钥进行加密解密

//rsa.php :
<?php
//私钥
$private_key = '-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDlRTEqGarpu6eesOseMMw4S7orIL43DJEU7LbOc8g1YWCRiQRK
BIiz3iyeAxAgOjRuSP+4mIL8V6FOS75lPPVM7F4FhrZzrqJaOcsCXrIUZ2cDoQ9+
Z17gHWmPVPVA9Q4QPO1A6KpeXpGjRmSSqIeLBmm3GtuSAN6tEP9KNSf/JQIDAQAB
AoGAWhUDqj0HkGqxA4MT/nrB4uSuMz/cPRjs8EHJ2fhYE9E89jHVw5dgdvu2oCcn
8OGttB9uioMyBCASOwc7ud9nqaEm7A8vS0QAV5thYC7hrn4x4HmskfpxdkGUol3i
xy7roe3sjtyG6E4VtVvCWr05HxBYPBSVXl9w6ODBHS3SeYkCQQD94Js1IlQpnPwx
OUpBopMOfr5qnu9sJoaxsCdo22B3alc5phP+2+Fz9ElaLi/3Jnn92hGuFTjF1pmd
M/mgY6v7AkEA5y/q0xsq1x+ya/oXjT6dkC4D1xaCduvASaKUiSEp3SbYjWx4FP7v
jgl2nrCGXjpPjW36rVyjbYDEAE+ZrvT3XwJAZlqFeJiMgfJuopHMZEXdL/zdXDMT
p/CoYT75xIadj8dpvy475YZUkOEuKZNxdx0mFbgzZJHdv7VTXVO1EnrcvQJBAJw3
KLnVVbFfXbTQnTF36ggOz9F7CFVLH/ehwDSZECy7nwCRFuM5EK4tftXj+ieZxz+N
3SFfw56ur8J2BybNqIkCQBLSa4KhNzHUcD7ZgfNTkvc6X2ajhgEBD47UIxQ80kRd
fPiAiZcfZnoRmi7NykALVilO32fUgovvfopi3aPeKCo=
-----END RSA PRIVATE KEY-----';

//公钥
$public_key = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlRTEqGarpu6eesOseMMw4S7or
IL43DJEU7LbOc8g1YWCRiQRKBIiz3iyeAxAgOjRuSP+4mIL8V6FOS75lPPVM7F4F
hrZzrqJaOcsCXrIUZ2cDoQ9+Z17gHWmPVPVA9Q4QPO1A6KpeXpGjRmSSqIeLBmm3
GtuSAN6tEP9KNSf/JQIDAQAB
-----END PUBLIC KEY-----';

//echo $private_key;
$pi_key = openssl_pkey_get_private($private_key);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id
$pu_key = openssl_pkey_get_public($public_key);//这个函数可用来判断公钥是否是可用的
print_r($pi_key);echo "\n";
print_r($pu_key);echo "\n";


$data = "www.lixiaocheng.com";//原始数据
$encrypted = ""; 
$decrypted = ""; 

echo "source data:",$data,"\n";

echo "private key encrypt:\n";

openssl_private_encrypt($data,$encrypted,$pi_key);//私钥加密
$encrypted = base64_encode($encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
echo $encrypted,"\n";

echo "public key decrypt:\n";

openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);//私钥加密的内容通过公钥可用解密出来
echo $decrypted,"\n";

echo "---------------------------------------\n";
echo "public key encrypt:\n";

openssl_public_encrypt($data,$encrypted,$pu_key);//公钥加密
$encrypted = base64_encode($encrypted);
echo $encrypted,"\n";

echo "private key decrypt:\n";
openssl_private_decrypt(base64_decode($encrypted),$decrypted,$pi_key);//私钥解密
echo $decrypted,"\n";

运行后输出:


>php rsa.php
Resource id #4
Resource id #5
source data:www.lixiaocheng.com
private key encrypt:
dR2713sx+kXvgY6s+A2i9eIDdo7dYMkN7bcp306TV7RbA7oD4YRHc4pW8S193ks+DyrLzvKllFIsy4IZEFLv+Tw41fpiEE+7ZwYf9j/j6p4JT7OH9LDaBuxSo1rHzhTbCB9ut3zrfD7JUl67UfWVHHNRJgJEbv10TMIKXhz4tQc=
public key decrypt:
www.lixiaocheng.com
---------------------------------------
public key encrypt:
begbEJ2j1FKwzIa4HOFcSw7orLWOZXOvpu85IX0VxXT0W5jqGFYc61zTjzvvBiGtdVrDiP72l61P2mNWFQ3unO5fnaHiBg0YP94wf2WKjPSo2G2JmGuRzvGvDkFUSle2QY2Sv9uHl8LvYNHFRtI4HRAP4ddniJr+3k80YbQKIF8=
private key decrypt:
www.lixiaocheng.com

>


阅读更多...

Memcache 查看列出所有key方法

分类:技术文档 - memcache | 阅读(2114) | 发布于:2016-12-01 14:15 | 标签: Memcache

1. cmd上登录memcache
telnet 127.0.0.1 11211 //这条是命令
2.  使用stats items命令列出所有keys
stats items    //这条是命令
//...
STAT items:7:number 16
STAT items:7:age 11237
STAT items:7:evicted 0
STAT items:7:evicted_nonzero 0
STAT items:7:evicted_time 0
STAT items:7:outofmemory 0
STAT items:7:tailrepairs 0
STAT items:7:reclaimed 184
STAT items:7:expired_unfetched 184
STAT items:7:evicted_unfetched 0
//...
END
3. 通过itemid获取key:基于列出的items id,本例中为7,第2个参数为列出的长度,0为全部列出
stats cachedump 7 0 //这条是命令
//...
ITEM tvmmr0ffcndg7vkda4hthp3vj2 [283 b; 1480574875 s]
ITEM ggt-wechat-accesstoken [230 b; 1474454246 s]
ITEM mad3o8177vbd01un1nf8r3ev66 [283 b; 1480566042 s]
ITEM 54eimuq8ft9526d7d9f6181sl7 [283 b; 1480561935 s]
//...
END
4. 通过get获取key值
上面的stats cachedump命令列出了我的session key,接下来就用get命令查找对应的session值
get tvmmr0ffcndg7vkda4hthp3vj2 //这条是命令
VALUE tvmmr0ffcndg7vkda4hthp3vj2 0 283
ggt_app_|a:1:{s:4:"user";a:9:{s:2:"Id";s:1:"1";s:8:"UserN......oleName";s:9:"产品部";s:6:"IsRoot";i:1;}}
END


阅读更多...

nginx根据url参数进行不同的代理

分类:技术文档 - Linux | 阅读(3065) | 发布于:2016-11-23 20:55 | 标签: nginx 反向代理

项目中由于产品迭代,新的版本不兼容旧的版本,但是又不能立马下线旧的版本,只能共存。
此时可以使用URL地址里面加版本号来区分,不同的版本号对应不同的产品版本。
例如,现在有8080,8081,8082三个版本,默认访问8080这个最老的版本。
配置nginx反向代理如下:
server {
        listen 80;
        server_name localhost;
        location / {
             set $proxyPort "8080";
             if ($arg_v = 1) {
                 set $proxyPort "8081";
             }
             if ($arg_v = 2) {
                 set $proxyPort "8082";
             }
             proxy_pass "http://127.0.0.1:$proxyPort";
        }
}
各版本配置:
server {
        listen 8080;
        server_name 8080;
        root /var/www/8080/;
        index index.html;
}
server {
        listen 8081;
        server_name 8081;
        root /var/www/8081/;
        index index.html;
}
server {
        listen 8082;
        server_name 8082;
        root /var/www/8082/;
        index index.html;
}
此时 ,访问http://hostname是走的端口号8080的代理,
访问http://hostname?v=1是走的端口号8081的代理,
访问http://hostname?v=2是走的端口号8082的代理.

阅读更多...