在QEMU-KVM环境下部署Oracle 19.16 RAC

KVM环境和其他虚拟化或真实生产最大差异主要就是在实施前期准备工作上:
具体在 DB节点 和存储环境 的准备工作上有差异,本文会详细说明。

而剩余基本软件安装和补丁应用部分无差异,若不清楚可以直接参考之前文章:

  • Linux平台 Oracle 19c RAC安装Part1:准备工作
  • Linux平台 Oracle 19c RAC安装Part2:GI配置
  • Linux平台 Oracle 19c RAC安装Part3:DB配置
  • Oracle 19c RAC 自动应用RU补丁简明版

下面就具体来看这两个方面的准备工作:

  • 1.DB节点准备
  • 2.存储环境准备

1.DB节点准备

为了尽可能减少配置,这里先将之前的db1环境做一些基础配置:

1)新增的100GB磁盘用于 /u01 目录挂载

[root@localhost ~]# pvcreate /dev/vdb
[root@localhost ~]# vgcreate ora /dev/vdb
[root@localhost ~]# lvcreate -l 25599 -n u01 ora
[root@localhost ~]# mkfs.xfs /dev/mapper/ora-u01
[root@localhost ~]# mkdir /u01
[root@localhost ~]# vi /etc/fstab 末尾添加一行:
/dev/mapper/ora-u01     /u01                    xfs     defaults        0 0
[root@localhost ~]# mount -a
[root@localhost ~]# df -h /u01
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/ora-u01  100G   33M  100G   1% /u01

2)主机名和hosts文件配置

这里初始化先设置为db01xx:

hostnamectl set-hostname db01xx 

/etc/hosts配置末尾增加一行:

192.168.1.6 db01xx

3)yum安装Oracle所需的软件包

yum -y install bc binutils compat-libcap1 compat-libstdc+±33 elfutils-libelf elfutils-libelf-devel \
fontconfig-devel glibc glibc-devel ksh libaio libaio-devel libX11 libXau libXi libXtst \
libXrender libXrender-devel libgcc libstdc++ libstdc+±devel libxcb make net-tools nfs-utils python \
python-configshell python-rtslib python-six targetcli smartmontools sysstat chronyvi ntp gcc unixODBC \
gcc-c++ psmisc unzip chrony perl perl-devel policycoreutils-python policycoreutils

4)网络需要添加私有网卡

目前只有桥接网卡,需要添加一个私有网卡,用于集群心跳等用途。步骤如下:

virsh domiflist db1
virsh attach-interface db1 network default
virsh dumpxml db1 > /etc/libvirt/qemu/db1.xml
virsh define /etc/libvirt/qemu/db1.xml

--输出如下:
[root@bogon vm-images]# virsh domiflist db1
接口     类型     源        型号      MAC
-------------------------------------------------------
vnet3      bridge     br0        virtio      52:54:00:9d:30:17

[root@bogon vm-images]# virsh attach-interface db1 network default
成功附加接口

[root@bogon vm-images]# virsh domiflist db1
接口     类型     源        型号      MAC
-------------------------------------------------------
vnet3      bridge     br0        virtio      52:54:00:9d:30:17
vnet4      network    default    rtl8139     52:54:00:79:88:c6

[root@bogon vm-images]# virsh dumpxml db1 > /etc/libvirt/qemu/db1.xml
[root@bogon vm-images]# virsh define /etc/libvirt/qemu/db1.xml
定义域 db1(从 /etc/libvirt/qemu/db1.xml)

--测试重启VM网卡是否依然存在:
[root@bogon vm-images]# virsh shutdown db1
域 db1 被关闭

[root@bogon vm-images]# virsh domiflist db1
接口     类型     源        型号      MAC
-------------------------------------------------------
-          bridge     br0        virtio      52:54:00:9d:30:17
-          network    default    rtl8139     52:54:00:79:88:c6

[root@bogon vm-images]# virsh start db1
域 db1 已开始

[root@bogon vm-images]# virsh domiflist db1
接口     类型     源        型号      MAC
-------------------------------------------------------
vnet3      bridge     br0        virtio      52:54:00:9d:30:17
vnet4      network    default    rtl8139     52:54:00:79:88:c6

这一步遇到添加网卡重启vm消失的问题,还是记录下过程备忘:

[root@bogon ~]# virsh attach-interface db1 network default
成功附加接口

[root@bogon ~]# virsh attach-interface db1 bridge br0
成功附加接口

[root@bogon ~]# ls -l /etc/libvirt/qemu/db1.xml
-rw-------. 1 root root 4751 1月   9 15:10 /etc/libvirt/qemu/db1.xml

--将当前的配置dump并写入到配置xml文件中
[root@bogon ~]# virsh dumpxml db1 > /etc/libvirt/qemu/db1.xml

在虚拟机上查看也会多了对应的网卡,网卡配置文件需要手工配置:

如果添加的网卡不再需要还可以删除:

[root@bogon ~]# virsh detach-interface db1 bridge
错误:域有 2 个接口。请使用 --mac 指定要分离的接口。
错误:分离接口失败

[root@bogon ~]# virsh domiflist db1
接口     类型     源        型号      MAC
-------------------------------------------------------
vnet3      bridge     br0        virtio      52:54:00:9d:30:17
vnet4      network    default    rtl8139     52:54:00:1d:aa:2f
vnet5      bridge     br0        rtl8139     52:54:00:12:b3:80

[root@bogon ~]# virsh detach-interface db1 bridge --mac 52:54:00:12:b3:80
成功分离接口

[root@bogon ~]# virsh domiflist db1
接口     类型     源        型号      MAC
-------------------------------------------------------
vnet3      bridge     br0        virtio      52:54:00:9d:30:17
vnet4      network    default    rtl8139     52:54:00:1d:aa:2f

[root@bogon ~]# virsh detach-interface db1 network
成功分离接口

[root@bogon ~]# virsh domiflist db1
接口     类型     源        型号      MAC
-------------------------------------------------------
vnet3      bridge     br0        virtio      52:54:00:9d:30:17

--将当前的配置dump并写入到配置xml文件中
[root@bogon ~]# virsh dumpxml db1 > /etc/libvirt/qemu/db1.xml

现在有个问题是,重启后添加的网卡会消失,虽然做了virsh dumpxml操作,保存到/etc/libvirt/qemu/db1.xml了;
也就是域中的信息没有获取正确的配置信息,看virsh help中尝试使用:

virsh define /etc/libvirt/qemu/db1.xml

[root@bogon vm-images]# virsh define /etc/libvirt/qemu/db1.xml
定义域 db1(从 /etc/libvirt/qemu/db1.xml)

然后再次尝试启停,终于稳定了,看来网上的经验不太完整,导致折腾了半天,以为是啥bug呢;

[root@bogon vm-images]# virsh domiflist db1
接口     类型     源        型号      MAC
-------------------------------------------------------
vnet3      bridge     br0        virtio      52:54:00:9d:30:17
vnet4      network    default    rtl8139     52:54:00:2c:48:57

[root@bogon vm-images]# virsh shutdown db1
域 db1 被关闭

[root@bogon vm-images]# virsh domiflist db1
接口     类型     源        型号      MAC
-------------------------------------------------------
-          bridge     br0        virtio      52:54:00:9d:30:17
-          network    default    rtl8139     52:54:00:2c:48:57

[root@bogon vm-images]#
[root@bogon vm-images]# virsh start db1
域 db1 已开始

[root@bogon vm-images]# virsh domiflist db1
接口     类型     源        型号      MAC
-------------------------------------------------------
vnet3      bridge     br0        virtio      52:54:00:9d:30:17
vnet4      network    default    rtl8139     52:54:00:2c:48:57

所以最开始是少了一个关键步骤把更改的xml加载到域,也就是说无论增加网卡还是删除网卡,之后都要做这两步才可以保证永久生效:

[root@bogon vm-images]# virsh dumpxml db1 > /etc/libvirt/qemu/db1.xml
[root@bogon vm-images]# virsh define /etc/libvirt/qemu/db1.xml
定义域 db1(从 /etc/libvirt/qemu/db1.xml)

当然,如果觉得命令行不好玩,也可以采用图形方式virt-manager来添加/删除设备。

添加网卡成功后,配置一个IP地址,测试网络和宿主机正常。
遇到网卡变成eth1重启又变成eth0的情况,应该是反复删除导致,测试正常稳定后,再进行下一步。

5)Oracle安装介质

在 /u01/media 目录下上传安装和补丁介质。

mkdir /u01/media
上传GI、DB、OPatch、RU补丁介质。

克隆两台机器:

在上面基础配置做完之后,直接关闭db1,然后基于db1直接克隆出两台机器,用于RAC的两个节点:

virsh shutdown db1

virt-clone --original db1 --name rac1 --auto-clone
virt-clone --original db1 --name rac2 --auto-clone

修改主机名和IP地址,然后配置/etc/hosts内容:

192.168.1.11 db01rac1
192.168.1.12 db01rac2
192.168.1.13 db01rac1-vip
192.168.1.14 db01rac2-vip
192.168.1.15 db01rac-scan

2.存储环境准备

基于vm1直接克隆出一台机器,用于RAC的共享存储(iSCSI模拟)

virt-clone --original vm1 --name storage1 --auto-clone

给vm1添加一块50G的磁盘,采用raw格式。
前面文章提过可以直接修改xml来添加磁盘,这次尝试使用命令的方式添加:

dd if=/dev/zero of=/flash/vm-images/s1-lun1.img bs=1M count=51200
virsh attach-disk storage1 /flash/vm-images/s1-lun1.img vdb

virsh dumpxml storage1 > /etc/libvirt/qemu/storage1.xml
virsh define /etc/libvirt/qemu/storage1.xml

这样添加的磁盘重启也不会丢失,可以观察xml变化,是一样的效果。下面是实际操作输出:

[root@bogon vm-images]# dd if=/dev/zero of=/flash/vm-images/s1-lun1.img bs=1M count=51200
记录了51200+0 的读入
记录了51200+0 的写出
53687091200字节(54 GB)已复制,84.4384 秒,636 MB/秒
[root@bogon vm-images]# virsh attach-disk storage1 /flash/vm-images/s1-lun1.img vdb
成功附加磁盘
[root@bogon vm-images]# virsh dumpxml storage1 > /etc/libvirt/qemu/storage1.xml
[root@bogon vm-images]# virsh define /etc/libvirt/qemu/storage1.xml
定义域 storage1(从 /etc/libvirt/qemu/storage1.xml)

这50G 的盘用于RAC的共享存储,计划分配:

OCRDG   3 * 1G
DATADG  30GB
ARCHDG  16GB

这里就可以直接参考之前文章 RHEL7 配置iSCSI模拟环境 来操作:

首先lvm按本次规划来创建:

pvcreate /dev/vdb
vgcreate vg_storage /dev/vdb
lvcreate -L 1g -n lv_lun1 vg_storage
lvcreate -L 1g -n lv_lun2 vg_storage
lvcreate -L 1g -n lv_lun3 vg_storage
lvcreate -L 30g -n lv_lun4 vg_storage
lvcreate -L 16g -n lv_lun5 vg_storage

使用yum安装targetd和targetcli,并配置好服务

yum -y install targetd targetcli
systemctl status targetd
systemctl start targetd
systemctl enable targetd
systemctl list-unit-files|grep targetd

targetcli进入命令行:

cd /backstores/block 
create disk1 /dev/mapper/vg_storage-lv_lun1
create disk2 /dev/mapper/vg_storage-lv_lun2
create disk3 /dev/mapper/vg_storage-lv_lun3
create disk4 /dev/mapper/vg_storage-lv_lun4
create disk5 /dev/mapper/vg_storage-lv_lun5

使用targetcli创建iqn和LUN

cd /iscsi
create
cd /iscsi/iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6/tpg1/luns
create /backstores/block/disk1
create /backstores/block/disk2
create /backstores/block/disk3
create /backstores/block/disk4
create /backstores/block/disk5

使用targetcli创建acls

cd /iscsi/iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6/tpg1/acls
create iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6:client

cd /iscsi/iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6/tpg1/portals
delete 0.0.0.0 3260
create 192.168.1.10

最终配置好的输出为:

/iscsi/iqn.20.../tpg1/portals> ls /
o- /  [...]
  o- backstores  [...]
  | o- block  [Storage Objects: 5]
  | | o- disk1  [/dev/mapper/vg_storage-lv_lun1 (1.0GiB) write-thru activated]
  | | | o- alua  [ALUA Groups: 1]
  | | |   o- default_tg_pt_gp  [ALUA state: Active/optimized]
  | | o- disk2  [/dev/mapper/vg_storage-lv_lun2 (1.0GiB) write-thru activated]
  | | | o- alua  [ALUA Groups: 1]
  | | |   o- default_tg_pt_gp  [ALUA state: Active/optimized]
  | | o- disk3  [/dev/mapper/vg_storage-lv_lun3 (1.0GiB) write-thru activated]
  | | | o- alua  [ALUA Groups: 1]
  | | |   o- default_tg_pt_gp  [ALUA state: Active/optimized]
  | | o- disk4  [/dev/mapper/vg_storage-lv_lun4 (30.0GiB) write-thru activated]
  | | | o- alua  [ALUA Groups: 1]
  | | |   o- default_tg_pt_gp  [ALUA state: Active/optimized]
  | | o- disk5  [/dev/mapper/vg_storage-lv_lun5 (16.0GiB) write-thru activated]
  | |   o- alua  [ALUA Groups: 1]
  | |     o- default_tg_pt_gp  [ALUA state: Active/optimized]
  | o- fileio  [Storage Objects: 0]
  | o- pscsi  [Storage Objects: 0]
  | o- ramdisk  [Storage Objects: 0]
  o- iscsi  [Targets: 1]
  | o- iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6  [TPGs: 1]
  |   o- tpg1  [no-gen-acls, no-auth]
  |     o- acls  [ACLs: 1]
  |     | o- iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6:client  [Mapped LUNs: 5]
  |     |   o- mapped_lun0  [lun0 block/disk1 (rw)]
  |     |   o- mapped_lun1  [lun1 block/disk2 (rw)]
  |     |   o- mapped_lun2  [lun2 block/disk3 (rw)]
  |     |   o- mapped_lun3  [lun3 block/disk4 (rw)]
  |     |   o- mapped_lun4  [lun4 block/disk5 (rw)]
  |     o- luns  [LUNs: 5]
  |     | o- lun0  [block/disk1 (/dev/mapper/vg_storage-lv_lun1) (default_tg_pt_gp)]
  |     | o- lun1  [block/disk2 (/dev/mapper/vg_storage-lv_lun2) (default_tg_pt_gp)]
  |     | o- lun2  [block/disk3 (/dev/mapper/vg_storage-lv_lun3) (default_tg_pt_gp)]
  |     | o- lun3  [block/disk4 (/dev/mapper/vg_storage-lv_lun4) (default_tg_pt_gp)]
  |     | o- lun4  [block/disk5 (/dev/mapper/vg_storage-lv_lun5) (default_tg_pt_gp)]
  |     o- portals  [Portals: 1]
  |       o- 192.168.1.10:3260  [OK]
  o- loopback  [Targets: 0]
  o- vhost  [Targets: 0]
/iscsi/iqn.20.../tpg1/portals>

如果系统开了防火墙,将防火墙添加放行tcp 3260端口:

firewall-cmd --permanent --add-port=3260/tcp
firewall-cmd --reload

到此,iSCSI服务端配置完成,需要到客户端配置,这里也就是RAC的2个节点上都要配置:

yum -y install iscsi-initiator-utils

vi /etc/iscsi/initiatorname.iscsi

#InitiatorName=iqn.1988-12.com.oracle:178a747c44
InitiatorName=iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6:client

--使用iscsiadm发现可用存储设备并登陆连接
iscsiadm -m discovery -t st -p 192.168.1.10
iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.storage.x8664:sn.d5fd6c3922b6 -p 192.168.1.10 --login

最终RAC两个节点fdisk -l 都可以看到新的5块磁盘:

[root@db01rac1 ~]# fdisk -l /dev/sd*

Disk /dev/sda: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sdc: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sdd: 32.2 GB, 32212254720 bytes, 62914560 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sde: 17.2 GB, 17179869184 bytes, 33554432 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

至此,所有准备工作完成。

AlfredZhao©版权所有「从Oracle起航,领略精彩的IT技术。」
本文转载于网络 如有侵权请联系删除

相关文章

  • AKShare-股票数据-上证行情数据

    作者寄语本次新增stock_sh_a_spot_em接口,该接口主要用于获取上海证券交易所所有股票的行情数据,同时增加总市值、流通市值、涨速、5分钟涨跌、60日涨跌幅和年初至今涨跌幅字段,该接口可以获取所有股票当前时点的多字段信息。更新接口"stock_sh_a_spot_em"#沪A股-行情数据沪A股接口:stock_sh_a_spot_em目标地址:http://quote.eastmoney.com/center/gridlist.html#sh_a_board描述:东方财富网-沪A股-实时行情数据限量:单次返回所有沪A股上市公司的实时行情数据输入参数名称类型描述---输出参数名称类型描述序号int64-代码object-名称object-最新价float64-涨跌幅float64注意单位:%涨跌额float64-成交量float64注意单位:手成交额float64注意单位:元振幅float64注意单位:%最高float64-最低float64-今开float64-昨收float64-量比float64-换手率float64注意单位:%市盈率-动态float6

  • 写给vue转react的同志们(1)

    本系列文章将由浅慢慢深入,一步步带你领略react和vue的同工异曲之处,让你左手react,右手vue无忧。 学习一个框架最好的办法就是从业务做起。首先我们要弄清做业务需要什么知识点去支持今天的主题:react是怎么样传输数据的react怎么封装组件react的生命周期实际上vue熟练的同学们,我觉得转react还是比较好上手的,就是要适应他的纯js的写法以及jsx等,个人认为还是比较好接受的,其实基本上都一样,只要弄清楚数据怎么传输怎么处理,那剩下的jsx大家都会写了吧。react组件通讯这里我们来跟vue对比一下。比如在vue中父子组件传值(简写)://父组件 data:{ testText:'这是父值' } methods:{ receive(val){ console.log('这是子值:',val) } } <child:testText="testText"@childCallBack="receive"/> //子组件 props:{ testText:{ type:String

  • windows:subst 映射文件夹为盘符塈设置开机启动执行bat脚本

    版权声明:本文为博主原创文章,转载请注明源地址。https://blog.csdn.net/10km/article/details/53353735在做开发的过程中(尤其是java开发),因为很多第三文件工具和库都是免安装的版本,解开就能用,所以我会以一个文件夹为根目录在此文件夹下保存所有的第三方工具和库,这样的好处是如果哪天要换电脑工作,只要把这个文件夹备份迁移到另一台电脑,基本上就可以开始工作了。 如下图文件夹j下面所有项目代码,开发工具及第三方库都放在这里 并且,将这个j文件夹映射成windows盘符J: 这样,我可以以J盘为基础,做所有的开发环境参数设置,这样的好处是,可以把将j文件夹放在任何一下文件夹下,只要将这个文件夹映射成一个盘符,路径长度就是一样的。 我们知道将一个文件夹映射成一个本地盘符只要用subst命令就能轻松完成。但是subst命令映射的盘符没办法保存,电脑重启就没有了,所以我们需要写一个脚本,让windows开机启动时执行这个脚本来完成subst的工作。。参见第一张图,在j盘下,我就写了一个名为j.bat的脚本。内容很简单:rem映射当前路径[%~sdp0

  • 稳定使用Google scholar,这些方法你get了没

    虽然说我们也有国产的百度学术,但和站在巨人肩膀上的GoogleScholar相比,只能说是拙劣的模仿者。 问题是在“访问外国网站”的号召下,目前想直接登录上GoogleScholar还比较困难。 但是“上有政策,下有对策”,这怎么可能难得倒智慧的中国人民。 应运而生的各类对策中,镜像网站应该是最便捷不费脑的方式了。 但问题是单一的镜像网站很容易就失效了,所以我们今天为大家介绍几个长期更新可用镜像网站的资源网站~ 1 http://ac.scmor.com/(思谋网) 2 https://google2.jiongjun.cc/ 网站除了提供稳定的Google和GoogleScholar的镜像网站外 还提供各种自行搭建镜像的方式以及各种国内外V**的下载途径 3 https://sci-hub.org.cn/ 联动Googlescholar,Sci-hub,lib-gen,pubmed的一个网站,所以相当于说不仅可以实现文献搜索,同时还可以完成文献的免费下载。 问题是本网站常常被下架,然后再常常杀回来,且用且珍惜~ 4 Idata Idata我

  • FFT结果的物理意义

    [附录:本测试数据使用的matlab程序] closeall;%先关闭所有图片 Adc=2;%直流分量幅度 A1=3;%频率F1信号的幅度 A2=1.5;%频率F2信号的幅度 F1=50;%信号1频率(Hz) F2=75;%信号2频率(Hz) Fs=256;%采样频率(Hz) P1=-30;%信号1相位(度) P2=90;%信号相位(度) N=256;%采样点数 t=[0:1/Fs:N/Fs];%采样时刻 %信号 S=Adc+A1*cos(2*pi*F1*t+pi*P1/180)+A2*cos(2*pi*F2*t+pi*P2/180); %显示原始信号 plot(S); title('原始信号'); figure; Y=fft(S,N);%做FFT变换 Ayy=(abs(Y));%取模 plot(Ayy(1:N));%显示原始的FFT模值结果 title('FFT模值'); figure; Ayy=Ayy/(N/2);%换算成实际的幅度 Ayy(1)=Ayy(1)/2; F=([1:N]-1)*Fs/N;%换算成实际的频率值 plot(F(1:N

  • Ubuntu 16.04 使用docker资料汇总与应用docker安装caffe并使用Classifier(ros kinetic+usb_cam+caffe)

    Docker是开源的应用容器引擎。若想简单了解一下,可以参考百度百科词条Docker。好像只支持64位系统。Docker官网:https://www.docker.com/ Docker—从入门到实践:https://yeasy.gitbooks.io/docker_practice/content/ Pdf版下载:http://download.csdn.net/detail/zhangrelay/9743400 caffe官网:http://caffe.berkeleyvision.org/installation.html caffe_docker:https://github.com/BVLC/caffe/tree/master/docker 然后参考这篇博客就可以了:http://blog.csdn.net/sysushui/article/details/54585788 看右图数据,准确识别出是磁罗盘(>0.8)。 如:dockersearchcaffe$dockersearchcaffe NAMEDESCRIPTIONSTARSOFFICIALAUTOMATED

  • 创业团队是否应该拿钱买理财产品?

    近日中国科技媒体上市(新三板)第一股虎嗅科技因为拿钱去买理财产品,并且收益率很低,而受到一些人质疑甚至嘲讽。明眼人一看就知道对应文章有些站不住脚,不值得推敲,不过关于创业团队是否该拿钱去买理财产品,倒是一个有意思的话题。据我了解,拿到融资的创业团队,大概有两种花钱观:一种是激进式的花钱。很舍得花钱,甚至是烧钱砸钱,融资时说好用一年最后半年就烧光了。办公室必须搬到顶级CBD,椅子都要参考腾讯买一万元一把的,创始人恨不得把小区电梯里面的分众广告都换成自己产品的。这种公司大概又有两个结局:一种是死了,昙花一现,死得很惨;还有一种是融到更多钱最后被收购或者上市了,这些是成功者,人们关注到的故事更多是这一类。一种是保守型花钱,慢慢花,能省则省,最后熬到自己都具有造血能力了,可以赚钱了,投资人的钱在账上待着,没地方花。至于当初为什么要拿这笔融资,或许是为了安全感,还有很多创业者是还没想好要做啥,或者当前这个阶段还不适合做想要做的那啥,所以钱就在那里待着吧。虎嗅或许是属于第二种。 质疑创业团队拿钱去买理财产品的大概有两种看法:一是为什么要把钱拿去买理财产品,而不是拿去做收益率更高的投资?比如虎嗅就可

  • SDN和数据中心蜜月后还能做点啥

    SDN的部署场景现在软件定义网络(SDN)已经渡过了蜜月期,迈向了实际部署阶段,在实际部署中需要解决更多的问题,追踪其部署状况是很有必要的。SDN市场想要发展到我们期望的水平还需要很长的时间,SDN正在聚焦企业和服务提供商网络的实际用例。全面采用SDN和网络虚拟化(NV)还没有实现,但它已经被前瞻性眼光的运营商和企业所采纳,一些市场领导者近期也表示了近期的发展。举个例子,市场的代表之一VMware,该公司第一季度的盈利是其NSX网络虚拟化业务的两倍,VMware表示现在有340个将NSX软件应用到产品中的用户。最近,我也采访了一些服务提供商、云计算厂商、企业SDN狂热者,看看他们对SDN和NV的看法。他们表示SDN部署有很多挑战,不是因为这个技术没有价值,而是因为软件的互操作性测试所面临的巨大挑战。尽管这些用户仍在销售其虚拟化基础设施的概念(两个大型服务提供商和云计算运营商),但他们同时也表示生态系统仍然需要时间来培养。根据SDxCentral.com的用户调查,去年的“数据中心的网络虚拟化”报告显示,75%的用户在数据中心部署网络虚拟化方案有一个良好的体验,其中60%初步获得成功,有

  • 一道面试题引发的思考(C#值类型和引用类型)

    某年某月,笔者去面试招行的一个外包项目,辗转来到面试地点以后,面试官给了我一份试卷,试卷只有两道题目,其中一道是这样的: 阅读以下程序 1classProgram 2{ 3structPoint 4{ 5publicintx; 6publicinty; 7publicPoint(intx,inty) 8{9 9this.x=x; 10this.y=y; 11} 12} 13 14 15staticvoidMain(string[]args) 16{ 17Pointp1=newPoint(100,100); 18Pointp2=p1; 19p1.x=200; 20Console.WriteLine("{0},{1}",p1.x,p2.x); 21Console.ReadLine(); 22 23} 24}复制 请写出p1.x和p2.x的值。   笔者属于那种基础不是很扎实的那种码农,平时也就是个CURDBoy,虽然明白这道题是考察变量在内存中的分配,但是之前没怎么在意这方面的问题,一时间竟然答不上来。  其实这道题目只要理解Struct结构是值类型的变量

  • PHP学习笔记02——简易计算器

    1<!DOCTYPEhtml> 2<html> 3<head> 4<title>PHP简易计算器</title> 5</head> 6<body> 7<?php 8$mess=""; 9if(isset($_POST["sub"])){ 10if($_POST["num1"]=="")$mess.="第一个数不能为空<br/>"; 11elseif(!is_numeric($_POST["num1"]))$mess.="第一个数必须是数字<br/>"; 12 13if($_POST["num2"]=="")$mess.="第二个数不能为空<br/>"; 14elseif(!is_numeric($_POST["num2"]))$mess.="第二个数必须是数字<br/>"; 15elseif($_POST["opt"]=="/"&&$_POST["num2"]==0)$mess.="除数必须为0<br/>"; 16} 17

  • svn使用教程

    svn使用教程:http://wiki.open.qq.com/wiki/SVN%E4%BD%BF%E7%94%A8%E6%8C%87%E5%BC%95%EF%BC%88%E6%9C%AC%E5%9C%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%BAWindows%EF%BC%89     SVN使用指引(本地服务器为Windows) 目录 [隐藏] 1.安装SVN客户端 2.创建本地目录并连接到SVN库 3.提交文件 4.修改文件 5.历史版本回滚 6.删除文件 7.其它操作 1.安装SVN客户端 使用SVN进行文件上传前,请在您的本地PC上安装SVN客户端。推荐使用1.7版本的SVN客户端。请不要升级到1.8版本,TortoiseSVN1.8版本存在缺陷,可能会导致SVN同步异常。 本地服务器为Windows时,推荐使用TortoiseSVN,下载地址:http://sourceforge.net/projects/tortoisesvn/files/ 下面的操作指引都以TortoiseSVN为例。

  • 注册用户名字符长度判断细节

          $username='刷_单8元1单淘宝客服20元1小时_我Q125556733jff';       var_dump(strlen($username));       var_dump(Library\Common::username_patten($username));   一、使用strlen来判断长度   里面的一个汉字会认为长度是3个字符(utf-8编码情况下一个汉字3个字符,gbk编码就是2个字符长度) 例子:  $username='刷_单8元'; var_dump(strlen($username));   长度是11。   刷,单,元 3*3=9 "_“和"8",总共是2个长度 9+2=11   具体做试验: $username='刷'; var_dump(strlen($u

  • 设计模式---原型模式

     故事背景:简历复制 概念:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone), Clone()实现和具体的语言相关,在C++中通过拷贝构造函数实现。 代码如下: #include<cstdio> //接口 classCPrototype { public: CPrototype(){} virtual~CPrototype(){} virtualCPrototype*Clone()=0; }; //实现 classCConcretePrototype:publicCPrototype { public: CConcretePrototype():m_counter(0){} virtual~CConcretePrototype(){} //拷贝构造函数 CConcretePrototype(constCConcretePrototype&rhs) { m_counter=rhs.m_counter; } //复制自

  • scratch能编写超简单的俄罗斯方块!

    俄罗斯方块是一款经典小游戏,相信大家都玩过。Scratch也能编出这么经典的游戏,你知道吗?先来看看效果:   效果怎么样?有兴趣的话请关注微信公众号:  

  • PHP出错信息Warning: require_once(./include/common.inc.php)解决办法

    这个问题,除了Discuz!各系列,其实还有很多程序会出现,比如wordpress等。 由于这类问题多次出现,于是在这里做一个解决记录。 简单来讲,这个问题是由于目录权限不足解决的,特别是在Windows+IIS中经常出现。 [php]require_once('./include/common.inc.php')[/php] 这句代码大约的意思是,取得当前程序文件所在的顶级目录下,某个目录下的文件,这里就要求访问上级目录的权限。 一开始我也没有找到原因所在,后来写了一句代码,来查看请求的目录,才发现一个奇怪的问题。发现"./"这样的代码,请求的目录竟然是分区所在的盘符。 如当前文件是:D:/www.4wei.cn/index.php,则Iuser用户则需要有“D:/”的可读权限。一般的安全设置下,根盘符一般权限较小,就会造成这个错误产生。 那,知道这个问题了,就有解决办法了。 一,将整个程序下移一个目录,将D:/www.4wei.cn/index.php改成D:/www.4wei.cn/bbs/index.php。二,然后给www.4wei.cn/bbs目录加上读取权限,包括文件夹中

  • C++中的静态绑定和动态绑定(转)

    原文转自 https://www.cnblogs.com/lizhenghn/p/3657717.html   C++在面向对象编程中,存在着静态绑定和动态绑定的定义,本节即是主要讲述这两点区分。我是在一个类的继承体系中分析的,因此下面所说的对象一般就是指一个类的实例。首先我们需要明确几个名词定义: 静态类型:对象在声明时采用的类型,在编译期既已确定; 动态类型:通常是指一个指针或引用目前所指对象的类型,是在运行期决定的; 静态绑定:绑定的是静态类型,所对应的函数或属性依赖于对象的静态类型,发生在编译期; 动态绑定:绑定的是动态类型,所对应的函数或属性依赖于对象的动态类型,发生在运行期; 从上面的定义也可以看出,非虚函数一般都是静态绑定,而虚函数都是动态绑定(如此才可实现多态性)。先看代码和运行结果: 1classA 2{ 3public: 4/*virtual*/voidfunc(){std::cout<<"A::func()\n";} 5}; 6classB:publicA 7{ 8public: 9voidfunc(){std::cou

  • 访问者模式

    1.访问者模式是什么 1.百度百科 访问者模式(VisitorPattern)表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。 2.维基百科 Inobject-orientedprogrammingandsoftwareengineering,thevisitordesignpatternisawayofseparatinganalgorithmfromanobjectstructureonwhichitoperates.Apracticalresultofthisseparationistheabilitytoaddnewoperationstoexistentobjectstructureswithoutmodifyingthestructures.Itisonewaytofollowtheopen/closedprinciple. 3.lz理解 在父类中添加一个抽象方法那么所欲的子类会产生改变。那么在不更改该父类和子类的结构情况下添加一个作用于子类元素的方法。 在被访问者中创建一个方法的引用。引用调用的是访问者的访问

  • 【死记硬背】CSS常用属性和注意事项

    ★ 超出省略号代替 {display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} 需要多个属性配合 强制不换行 white-space:nowrap; 自动换行 word-wrap:break-word; word-break:normal;  强制英文单词断行 word-break:break-all; 文字两端对齐 text-align:justify     ★ 对于不支持maxmincss属性的低版本浏览器的处理方法: body{ font-family:microsoftYahei; min-width:1200px; background:#f5f5f5; _width:expression(document.documentElement.clientWidth>1200?document.documentElement.clientWidth:1200); }复制  

  • 机电传动控制第五,六周作业

    机电传动控制第五,六周作业 1自行查阅参考文献,了解几种主要的低压接地系统的概念:TN,TT,IT: TT系统: 人身保护技术:将外漏可导电部分接地并装用剩余电流动作器 动作技术:发生第一次绝缘故障即切断电源 TN系统: 人身保护技术:强制性要求将外露导电部分和中性点连通并接地;装用过电流动作电器(断路器或熔断器)在第一次故障时切断电源。 动作技术:发生第一次绝缘故障,即切断电源。 IT系统: 人身保护技术:将诸外露导电部分互相连通并接地;装用绝缘监测器(IMD)对第一次故障报警;装用过电流保护电器(断路器或熔断器)在发生第二次故障时切断电源。 运行技术:监测第一次绝缘故障;强制性地定位故障和清除故障;同时发生两个绝缘故障时切断电源 参考资料: http://cn.electrical-installation.org/cnw/index.php?title=TT%E3%80%81TN_%E5%92%8C_IT_%E7%B3%BB%E7%BB%9F%E7%9A%84%E7%89%B9%E6%80%A7&variant=zh#.E4.B8.BB.E8.A6.81.E7.89.B9

  • 函数栈帧

    在函数栈帧中 一般包含以下几类重要信息 1局部变量:为函数局部变量开辟的内存空间 2栈帧状态值:保存前 栈帧的顶部和底部 3函数返回地址:保存当前函数调用前的“断点”信息,也就是函数调用前的指令位置 以便在函数返回时能够恢复到函数被调用前的代码区中继续执行指令。     EIP:指令寄存器:其内存放着一个指针,该指针永远指向下一条等待执行的指令地址 可以说控制了EIP寄存器的内容,就控制了进程 我们让EIP指向哪里,CPU就会去执行哪里的指令。 EIP劫持原理。

  • Beta冲刺 (3/5)

    Beta冲刺(3/5) 基本情况 队名:创造404 组长博客 作业博客 Github 组员人数:10 冲刺概况汇报 林志航(组长) 完成的任务 搜索按价格排序 搜索按新旧程度排序 GitHub记录 接下来的计划: 完善小程序 debug 修改个人信息 奖励电子书机制 还剩下的任务 界面优化 调试小程序 完善小程序 debug 修改个人信息 奖励电子书机制 燃尽图 遇到的困难 页面太多,不好修改 收获和疑问 收获:学会了手动发布书籍、和发布程序 疑问:如何高效改bug PSP和学习进度条 PSP PersonalSoftwareProcesstages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 30 30 Estimate 估计这个任务需要多少时间 30 30 Development 开发 265 260 Analysis 需求分析(包括学习新技术) 30 30 DesignSpec 生成设计文档 10 10 DesignReview 设计复审 5 5 CodingStandard 代码规范(为目

相关推荐

推荐阅读